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)); } } }