FaZeBookSocialNetwork / www / src / FaZeBook / Page / MessengerAPI.php
MessengerAPI.php
Raw
<?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
        ];
    }
}