listenCommands(); } public function logMessage(IRCMessage $msg) { $msg->log(); } public function handlePrivMsg(IRCMessage $msg) { $target = $msg->getPrivMsgTarget(); if ($target[0] != '#') return; // direct message $channel = $this->getMessageChannel($msg); if (!$channel) return; $text = $msg->getText(); if ($text[0] == '!') { $this->handleChatCommand($channel, $msg); } else if ( $channel->isAcceptingGuesses() && !empty($msg->tags['user-id']) && !empty($msg->tags['display-name'] && $channel->isValidGuess($text)) ) { $uid = 't:'.$msg->tags['user-id']; $uname = $msg->tags['display-name']; try { $channel->registerGuess($uid, $uname, $text); } catch (\Exception $e) { $this->getLogger()->warning('error registering guess "'.$text.'" on channel '.$channel->title.': '.$e->getMessage()); } } } public function handleChatCommand(Channel $channel, IRCMessage $msg) { $cmd = explode(' ', ltrim($msg->getText(), '!'), 2); $cmd_name = strtolower($cmd[0]); if (!isset($channel->chat_commands[$cmd_name])) return; $config = $channel->chat_commands[$cmd_name]; $this->getLogger()->info('got command '.$cmd_name.' on channel '.$channel->title); try { $command = ChatCommand::create($this, $channel, $config); if ($command->checkAccess($msg)) { $command->execute($cmd[1] ?? ''); } } catch (\Exception $e) { $this->getLogger()->warning('error executing command '.$cmd_name.' 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)); } } }