+ public function handleIRCMessage(IRCMessage $msg) {
+ $this->last_contact = time();
+ if ($msg->isPing()) {
+ $this->sendIRCMessage($msg->makePong());
+ return;
+ }
+ if ($msg->isPong()) {
+ return;
+ }
+ $this->logMessage($msg);
+ if ($msg->isPrivMsg()) {
+ $this->handlePrivMsg($msg);
+ return;
+ }
+ if ($msg->isWhisper()) {
+ $this->handleWhisper($msg);
+ return;
+ }
+ if ($msg->isNotice() && $msg->getText() == 'Login authentication failed') {
+ $this->logger->notice('login failed, refreshing access token');
+ $this->token->refresh();
+ $this->login();
+ return;
+ }
+ if ($msg->command == '001') {
+ // successful login
+ $this->joinChannels();
+ $this->ready = true;
+ return;
+ }
+ if ($msg->command == 'GLOBALUSERSTATE') {
+ // receive own user metadata
+ $this->handleUserState($msg);
+ return;
+ }
+ }
+
+ public function getMessageChannel(IRCMessage $msg) {
+ $target = $msg->getPrivMsgTarget();
+ 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 handleUserState(IRCMessage $msg) {
+ if (isset($msg->tags['user-id'])) {
+ $this->user_id = $msg->tags['user-id'];
+ }
+ }
+
+ public function handleWhisper(IRCMessage $msg) {
+ }
+
+ public function login() {
+ $this->ws->send('PASS oauth:'.$this->token->access);
+ $this->ws->send('NICK '.$this->nick);
+ }
+
+ public function joinChannels() {
+ }
+
+ private function startPinger() {
+ $this->getLoop()->addPeriodicTimer(15, function () {
+ if (!$this->ready) return;
+ if (time() - $this->last_contact < 60) return;
+ try {
+ $this->sendIRCMessage(IRCMessage::ping($this->nick));
+ } catch (\Exception $e) {
+ }
+ });
+ }
+
+ public function sendIRCMessage(IRCMessage $msg) {
+ $irc_message = $msg->encode();
+ $this->logger->info('sending IRC message '.$irc_message);
+ $this->ws->send($irc_message);
+ $this->last_contact = time();
+ }
+
+ public function sendWhisper($to, $msg) {
+ $this->logger->info('sending whisper to '.$to.': '.$msg);
+ try {
+ $response = $this->token->request()->post('/whispers?from_user_id='.$this->user_id.'&to_user_id='.$to, [
+ 'message' => $msg,
+ ]);
+ if (!$response->successful()) {
+ $this->logger->error('sending whisper to '.$to.': '.$response->status());
+ }
+ } catch (\Exception $e) {
+ $this->logger->error('sending whisper to '.$to.': '.$e->getMessage());
+ }
+ }
+
+
+ protected function listenCommands() {
+ $this->getLoop()->addPeriodicTimer(1, function () {
+ if (!$this->isReady()) return;
+ $command = TwitchBotCommand::where('bot_nick', '=', $this->nick)->where('status', '=', 'pending')->oldest()->first();
+ if ($command) {
+ try {
+ $command->execute($this);
+ } catch (\Exception $e) {
+ }
+ }
+ });
+ }
+
+