. * * @category Message * @package Laconica * @author Evan Prodromou * @copyright 2008 Control Yourself, Inc. * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://laconi.ca/ */ if (!defined('LACONICA')) { exit(1); } require_once INSTALLDIR.'/lib/personal.php'; define('MESSAGES_PER_PAGE', 20); /** * common superclass for direct messages inbox and outbox * * @category Message * @package Laconica * @author Evan Prodromou * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://laconi.ca/ * @see InboxAction * @see OutboxAction */ class MailboxAction extends PersonalAction { var $page = null; function prepare($args) { parent::prepare($args); $nickname = common_canonical_nickname($this->arg('nickname')); $this->user = User::staticGet('nickname', $nickname); $this->page = $this->trimmed('page'); if (!$this->page) { $this->page = 1; } return true; } /** * output page based on arguments * * @param array $args HTTP arguments (from $_REQUEST) * * @return void */ function handle($args) { parent::handle($args); if (!$this->user) { $this->clientError(_('No such user.'), 404); return; } $cur = common_current_user(); if (!$cur || $cur->id != $this->user->id) { $this->clientError(_('Only the user can read their own mailboxes.'), 403); return; } $this->showPage(); } function showLocalNav() { $nav = new PersonalGroupNav($this); $nav->show(); } function showNoticeForm() { $message_form = new MessageForm($this); $message_form->show(); } function showContent() { $message = $this->getMessages(); if ($message) { $cnt = 0; $this->elementStart('ul', array('id' => 'messages')); while ($message->fetch() && $cnt <= MESSAGES_PER_PAGE) { $cnt++; if ($cnt > MESSAGES_PER_PAGE) { break; } $this->showMessage($message); } $this->elementEnd('ul'); $this->pagination($this->page > 1, $cnt > MESSAGES_PER_PAGE, $this->page, $this->trimmed('action'), array('nickname' => $this->user->nickname)); $message->free(); unset($message); } } function getMessages() { return null; } /** * returns the profile we want to show with the message * * For inboxes, we show the sender; for outboxes, the recipient. * * @param Message $message The message to get the profile for * * @return Profile The profile that matches the message */ function getMessageProfile($message) { return null; } /** * show a single message in the list format * * XXX: This needs to be extracted out into a MessageList similar * to NoticeList. * * @param Message $message the message to show * * @return void */ function showMessage($message) { $this->elementStart('li', array('class' => 'message_single', 'id' => 'message-' . $message->id)); $profile = $this->getMessageProfile($message); $avatar = $profile->getAvatar(AVATAR_STREAM_SIZE); $this->elementStart('a', array('href' => $profile->profileurl)); $this->element('img', array('src' => ($avatar) ? common_avatar_display_url($avatar) : common_default_avatar(AVATAR_STREAM_SIZE), 'class' => 'avatar stream', 'width' => AVATAR_STREAM_SIZE, 'height' => AVATAR_STREAM_SIZE, 'alt' => ($profile->fullname) ? $profile->fullname : $profile->nickname)); $this->elementEnd('a'); $this->element('a', array('href' => $profile->profileurl, 'class' => 'nickname'), $profile->nickname); // FIXME: URL, image, video, audio $this->elementStart('p', array('class' => 'content')); $this->raw($message->rendered); $this->elementEnd('p'); $messageurl = common_local_url('showmessage', array('message' => $message->id)); // XXX: we need to figure this out better. Is this right? if (strcmp($message->uri, $messageurl) != 0 && preg_match('/^http/', $message->uri)) { $messageurl = $message->uri; } $this->elementStart('p', 'time'); $this->element('a', array('class' => 'permalink', 'href' => $messageurl, 'title' => common_exact_date($message->created)), common_date_string($message->created)); if ($message->source) { $this->text(_(' from ')); $this->showSource($message->source); } $this->elementEnd('p'); $this->elementEnd('li'); } /** * Show the page notice * * Shows instructions for the page * * @return void */ function showPageNotice() { $instr = $this->getInstructions(); $output = common_markup_to_html($instr); $this->elementStart('div', 'instructions'); $this->raw($output); $this->elementEnd('div'); } /** * Show the source of the message * * Returns either the name (and link) of the API client that posted the notice, * or one of other other channels. * * @param string $source the source of the message * * @return void */ function showSource($source) { $source_name = _($source); switch ($source) { case 'web': case 'xmpp': case 'mail': case 'omb': case 'api': $this->element('span', 'noticesource', $source_name); break; default: $ns = Notice_source::staticGet($source); if ($ns) { $this->element('a', array('href' => $ns->url), $ns->name); } else { $this->element('span', 'noticesource', $source_name); } break; } return; } }