]> git.localhorst.tv Git - alttp.git/blobdiff - app/TwitchBot/TwitchAppBot.php
add chat bot
[alttp.git] / app / TwitchBot / TwitchAppBot.php
diff --git a/app/TwitchBot/TwitchAppBot.php b/app/TwitchBot/TwitchAppBot.php
new file mode 100644 (file)
index 0000000..4e2c7d4
--- /dev/null
@@ -0,0 +1,69 @@
+<?php
+
+namespace App\TwitchBot;
+
+use App\Models\Channel;
+use App\Models\TwitchBotCommand;
+
+class TwitchAppBot extends TwitchBot {
+
+       public function __construct() {
+               parent::__construct('localhorsttv');
+               $this->listenCommands();
+       }
+
+       public function logMessage(IRCMessage $msg) {
+               $msg->log();
+       }
+
+       public function handlePrivMsg(IRCMessage $msg) {
+               $target = $msg->getPrivMsgTarget();
+               if ($target[0] != '#') return; // direct message
+               $text = $msg->getText();
+               if ($text[0] != '!') return;
+               $channel = $this->getMessageChannel($msg);
+               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->getLogger()->info('got command '.$cmd[0].' on channel '.$channel->title);
+               try {
+                       $command = ChatCommand::create($this, $channel, $config);
+                       $command->execute($cmd[1] ?? '');
+               } catch (\Exception $e) {
+                       $this->getLogger()->warning('error executing command '.$cmd[0].' on channel '.$channel->title.': '.$e->getMessage());
+               }
+       }
+
+       public function joinChannels() {
+               $this->getLogger()->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->isReady()) return;
+                       $command = TwitchBotCommand::where('status', '=', 'pending')->oldest()->first();
+                       if ($command) {
+                               try {
+                                       $command->execute($this);
+                               } catch (\Exception $e) {
+                               }
+                       }
+               });
+       }
+
+}