<?php namespace FaZeBook\Page; use Application\Page\PageInterface; use FaZeBook\Data; use FaZeBook\Data\User; use FaZeBook\Session; class MessengerAPI implements PageInterface { const MESSENGER_ONLINE_TIMEOUT_SECONDS = 1; public function getId() { return "messenger"; } public function hasNavigationItem() { return false; } public function getTitle() { return ''; } public function getViewScript() { return __DIR__.'/../../../view/app/json_output.php'; } private function getOnlineStatus(User $user) : bool { return (time() - $user->getLastSeen()->getTimestamp()) <= self::MESSENGER_ONLINE_TIMEOUT_SECONDS; } private function getFriendList() { $currUser = Session::getInstance()->currentUser(); $friends = Data::getInstance()->listFriends($currUser); $list = []; foreach ($friends as $friend) { $data = [ 'id' => $friend->getId(), 'firstName' => $friend->getFirstName(), 'lastName' => $friend->getLastName(), 'karma' => $friend->getKarma(), 'online' => $this->getOnlineStatus($friend), 'unread' => Data::getInstance()->countUnreadMessagesBetween($currUser, $friend) ]; $list[] = $data; } return $list; } private function sendMessage(int $recipient, string $content) { $userA = Session::getInstance()->currentUser(); $userB = Data::getInstance()->getUser($recipient); if ($userB !== null) { // recipient exists if (Data::getInstance()->isFriend($userA, $userB)) { // we are friends with the recipient // filter out evil XSS $content = htmlspecialchars($content); Data::getInstance()->addMessage($userA, $userB, $content); } } } private function getMessageLog(int $partnerId) { $userA = Session::getInstance()->currentUser(); $userB = Data::getInstance()->getUser($partnerId); $messages = []; if ($userB !== null) { $log = Data::getInstance()->listMessagesBetween($userA, $userB); foreach ($log as $message) { $senderUser = $message->getSender(); $senderName = $senderUser->getFirstName() . ' ' . $senderUser->getLastName(); $initials = $senderUser->getFirstName()[0] . $senderUser->getLastName()[0]; $data = [ 'id' => $message->getId(), 'senderId' => $message->getSender()->getId(), 'recipientId' => $message->getRecipient()->getId(), 'senderName' => $senderName, 'initials' => $initials, 'time' => time() - $message->getTime()->getTimestamp(), 'content' => $message->getContent() ]; // mark any messages that were sent TO us as read if ($senderUser == $userB) { $message->markRead(); } $messages[] = $data; } return $messages; } return []; } public function getViewVariables() { // the messenger API handles the last seen status Session::getInstance()->currentUser()->updateLastSeen(); $variables = []; if (isset($_GET['action'])) { $action = $_GET['action']; switch ($action) { case 'friends': $variables = $this->getFriendList(); break; case 'msg_send': if (isset($_POST['id']) && isset($_POST['content'])) { // no response from sendMessage => no need to change $variables $this->sendMessage($_POST['id'], $_POST['content']); } break; case 'msg_log': if (isset($_GET['id'])) { $variables = $this->getMessageLog($_GET['id']); } break; default: break; } } $json = json_encode($variables); return [ 'json' => $json ]; } }