]> git.localhorst.tv Git - alttp.git/blobdiff - app/TwitchBot/TwitchBot.php
add chat bot
[alttp.git] / app / TwitchBot / TwitchBot.php
index c8d77a36d6f656007a0b3b50c009689b55f3adbe..79b6bf13f1861af5bde63e400992cbc060e08ae0 100644 (file)
@@ -3,7 +3,6 @@
 namespace App\TwitchBot;
 
 use App\Models\Channel;
-use App\Models\TwitchBotCommand;
 use App\Models\TwitchToken;
 use Monolog\Handler\StreamHandler;
 use Monolog\Logger;
@@ -14,18 +13,18 @@ use React\EventLoop\Loop;
 
 class TwitchBot {
 
-       public function __construct() {
+       public function __construct($nick) {
+               $this->nick = $nick;
                $this->logger = new Logger('TwitchBot');
                $this->logger->pushHandler(new StreamHandler('php://stdout', Logger::INFO));
 
-               $this->token = TwitchToken::firstWhere('nick', 'localhorsttv');
+               $this->token = TwitchToken::firstWhere('nick', $nick);
                if (!$this->token) {
                        throw new \Exception('unable to find access token');
                }
 
                $this->connector = new Connector();
                $this->connect();
-               $this->listenCommands();
                $this->startPinger();
        }
 
@@ -37,6 +36,10 @@ class TwitchBot {
                return Loop::get();
        }
 
+       public function isReady() {
+               return $this->ready;
+       }
+
        public function run() {
                $this->shutting_down = false;
                $this->getLoop()->run();
@@ -106,7 +109,7 @@ class TwitchBot {
                if ($msg->isPong()) {
                        return;
                }
-               $msg->log();
+               $this->logMessage($msg);
                if ($msg->isPrivMsg()) {
                        $this->handlePrivMsg($msg);
                        return;
@@ -125,58 +128,26 @@ class TwitchBot {
                }
        }
 
-       public function handlePrivMsg(IRCMessage $msg) {
+       public function getMessageChannel(IRCMessage $msg) {
                $target = $msg->getPrivMsgTarget();
-               if ($target[0] != '#') return; // direct message
-               $text = $msg->getText();
-               if ($text[0] != '!') return;
-               $channel = Channel::firstWhere('twitch_chat', '=', $target);
-               if (!$channel) return;
-               $this->handleChatCommand($channel, $msg);
-       }
-
-       public function handleChatCommand(Channel $channel, IRCMessage $msg) {
-               $cmd = explode(' ', ltrim($msg->getText(), '!'), 2);
-               if (!isset($channel->chat_commands[$cmd[0]])) return;
-               $config = $channel->chat_commands[$cmd[0]];
-               $this->logger->info('got command '.$cmd[0].' on channel '.$channel->title);
-               try {
-                       $command = ChatCommand::create($this, $channel, $config);
-                       $command->execute($cmd[1] ?? '');
-               } catch (\Exception $e) {
-                       $this->logger->warning('error executing command '.$cmd[0].' on channel '.$channel->title.': '.$e->getMessage());
+               if (substr($target, 0, 1) !== '#') {
+                       $target = '#'.$target;
                }
+               return Channel::firstWhere('twitch_chat', '=', $target);
+       }
+
+       public function logMessage(IRCMessage $msg) {
+       }
+
+       public function handlePrivMsg(IRCMessage $msg) {
        }
 
        public function login() {
                $this->ws->send('PASS oauth:'.$this->token->access);
-               $this->ws->send('NICK localhorsttv');
+               $this->ws->send('NICK '.$this->nick);
        }
 
        public function joinChannels() {
-               $this->logger->info('joining channels');
-               $channels = Channel::where('twitch_chat', '!=', '')->where('join', '=', true)->get();
-               $names = [];
-               foreach ($channels as $channel) {
-                       $names[] = $channel->twitch_chat;
-               }
-               $chunks = array_chunk($names, 10);
-               foreach ($chunks as $chunk) {
-                       $this->sendIRCMessage(IRCMessage::join($chunk));
-               }
-       }
-
-       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) {
-                               }
-                       }
-               });
        }
 
        private function startPinger() {
@@ -200,6 +171,7 @@ class TwitchBot {
 
        private $logger;
 
+       private $nick;
        private $token;
 
        private $connector;