]> git.localhorst.tv Git - alttp.git/blobdiff - app/TwitchBot/TwitchBot.php
basic twitch join/part commands
[alttp.git] / app / TwitchBot / TwitchBot.php
index 3cba5d958bac4975fd2e3fdf93fd901208ffcc18..ddc51fe046b2e68d448a18b04cc272ab8702a8c3 100644 (file)
@@ -3,6 +3,7 @@
 namespace App\TwitchBot;
 
 use App\Models\Channel;
+use App\Models\TwitchBotCommand;
 use App\Models\TwitchToken;
 use Monolog\Handler\StreamHandler;
 use Monolog\Logger;
@@ -24,6 +25,7 @@ class TwitchBot {
 
                $this->connector = new Connector();
                $this->connect();
+               $this->listenCommands();
        }
 
        public function getLogger() {
@@ -75,12 +77,13 @@ class TwitchBot {
        public function handleWsMessage(Message $message, WebSocket $ws) {
                $irc_messages = explode("\r\n", rtrim($message->getPayload(), "\r\n"));
                foreach ($irc_messages as $irc_message) {
-                       $this->logger->debug('received IRC message '.$irc_message);
+                       $this->logger->info('received IRC message '.$irc_message);
                        $this->handleIRCMessage(IRCMessage::fromString($irc_message));
                }
        }
 
        public function handleWsClose(int $op, string $reason) {
+               $this->ready = false;
                $this->logger->info('websocket connection closed: '.$reason.' ['.$op.']');
                if (!$this->shutting_down) {
                        $this->logger->info('reconnecting in 10 seconds');
@@ -111,6 +114,7 @@ class TwitchBot {
                if ($msg->command == '001') {
                        // successful login
                        $this->joinChannels();
+                       $this->ready = true;
                        return;
                }
        }
@@ -145,7 +149,7 @@ class TwitchBot {
 
        public function joinChannels() {
                $this->logger->info('joining channels');
-               $channels = Channel::where('twitch_chat', '!=', '')->get();
+               $channels = Channel::where('twitch_chat', '!=', '')->where('join', '=', true)->get();
                $names = [];
                foreach ($channels as $channel) {
                        $names[] = $channel->twitch_chat;
@@ -156,9 +160,23 @@ class TwitchBot {
                }
        }
 
+       private function listenCommands() {
+               $this->getLoop()->addPeriodicTimer(1, function () {
+                       if (!$this->ready) return;
+                       $command = TwitchBotCommand::where('status', '=', 'pending')->oldest()->first();
+                       if ($command) {
+                               try {
+                                       $command->execute($this);
+                               } catch (\Exception $e) {
+                               }
+                       }
+               });
+
+       }
+
        public function sendIRCMessage(IRCMessage $msg) {
                $irc_message = $msg->encode();
-               $this->logger->debug('sending IRC message '.$irc_message);
+               $this->logger->info('sending IRC message '.$irc_message);
                $this->ws->send($irc_message);
        }
 
@@ -169,6 +187,7 @@ class TwitchBot {
 
        private $connector;
        private $ws;
+       private $ready = false;
        private $shutting_down = false;
 
 }