summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--actions/inbox.php50
-rw-r--r--actions/outbox.php50
-rw-r--r--classes/Message.php8
-rw-r--r--htaccess.sample2
-rw-r--r--lib/mailbox.php159
-rw-r--r--lib/personal.php110
-rw-r--r--lib/stream.php72
-rw-r--r--lib/util.php2
-rw-r--r--theme/stoica/display.css51
9 files changed, 434 insertions, 70 deletions
diff --git a/actions/inbox.php b/actions/inbox.php
new file mode 100644
index 000000000..73155efd7
--- /dev/null
+++ b/actions/inbox.php
@@ -0,0 +1,50 @@
+<?php
+/*
+ * Laconica - a distributed open-source microblogging tool
+ * Copyright (C) 2008, Controlez-Vous, Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+if (!defined('LACONICA')) { exit(1); }
+
+require_once(INSTALLDIR.'/lib/mailbox.php');
+
+class InboxAction extends MailboxAction {
+
+ function get_title($user, $page) {
+ if ($page > 1) {
+ $title = sprintf(_("Inbox for %s - page %d"), $user->nickname, $page);
+ } else {
+ $title = sprintf(_("Inbox for %s"), $user->nickname);
+ }
+ }
+
+ function get_messages($user, $page) {
+ $message = new Message();
+ $message->to_profile = $user->id;
+ $message->orderBy('created DESC, id DESC');
+ $message->limit((($page-1)*MESSAGES_PER_PAGE), MESSAGES_PER_PAGE + 1);
+
+ if ($message->find()) {
+ return $message;
+ } else {
+ return NULL;
+ }
+ }
+
+ function get_message_profile($message) {
+ return $message->getFrom();
+ }
+}
diff --git a/actions/outbox.php b/actions/outbox.php
new file mode 100644
index 000000000..b09cd2032
--- /dev/null
+++ b/actions/outbox.php
@@ -0,0 +1,50 @@
+<?php
+/*
+ * Laconica - a distributed open-source microblogging tool
+ * Copyright (C) 2008, Controlez-Vous, Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+if (!defined('LACONICA')) { exit(1); }
+
+require_once(INSTALLDIR.'/lib/mailbox.php');
+
+class OutboxAction extends MailboxAction {
+
+ function get_title($user, $page) {
+ if ($page > 1) {
+ $title = sprintf(_("Outbox for %s - page %d"), $user->nickname, $page);
+ } else {
+ $title = sprintf(_("Outbox for %s"), $user->nickname);
+ }
+ }
+
+ function get_messages($user, $page) {
+ $message = new Message();
+ $message->from_profile = $user->id;
+ $message->orderBy('created DESC, id DESC');
+ $message->limit((($page-1)*MESSAGES_PER_PAGE), MESSAGES_PER_PAGE + 1);
+
+ if ($message->find()) {
+ return $message;
+ } else {
+ return NULL;
+ }
+ }
+
+ function get_message_profile($message) {
+ return $message->getTo();
+ }
+}
diff --git a/classes/Message.php b/classes/Message.php
index 3f01e3c83..93ec419d4 100644
--- a/classes/Message.php
+++ b/classes/Message.php
@@ -26,4 +26,12 @@ class Message extends DB_DataObject
/* the code above is auto generated do not remove the tag below */
###END_AUTOCODE
+
+ function getFrom() {
+ return Profile::staticGet('id', $this->from_profile);
+ }
+
+ function getTo() {
+ return Profile::staticGet('id', $this->to_profile);
+ }
}
diff --git a/htaccess.sample b/htaccess.sample
index 30f1bb531..364c35b07 100644
--- a/htaccess.sample
+++ b/htaccess.sample
@@ -71,6 +71,8 @@ RewriteRule ^(\w+)/replies$ index.php?action=replies&nickname=$1 [L,QSA]
RewriteRule ^(\w+)/replies/rss$ index.php?action=repliesrss&nickname=$1 [L,QSA]
RewriteRule ^(\w+)/avatar/(original|96|48|24)$ index.php?action=avatarbynickname&nickname=$1&size=$2 [L,QSA]
RewriteRule ^(\w+)/favorites$ index.php?action=showfavorites&nickname=$1 [L,QSA]
+RewriteRule ^(\w+)/inbox$ index.php?action=inbox&nickname=$1 [L,QSA]
+RewriteRule ^(\w+)/outbox$ index.php?action=outbox&nickname=$1 [L,QSA]
RewriteRule ^(\w+)$ index.php?action=showstream&nickname=$1 [L,QSA]
diff --git a/lib/mailbox.php b/lib/mailbox.php
new file mode 100644
index 000000000..5ad63cbaa
--- /dev/null
+++ b/lib/mailbox.php
@@ -0,0 +1,159 @@
+<?php
+/*
+ * Laconica - a distributed open-source microblogging tool
+ * Copyright (C) 2008, Controlez-Vous, Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+if (!defined('LACONICA')) { exit(1); }
+
+require_once(INSTALLDIR.'/lib/personal.php');
+
+define('MESSAGES_PER_PAGE', 20);
+
+class MailboxAction extends PersonalAction {
+
+ function handle($args) {
+
+ parent::handle($args);
+
+ $nickname = common_canonical_nickname($this->arg('nickname'));
+ $user = User::staticGet('nickname', $nickname);
+
+ if (!$user) {
+ $this->client_error(_('No such user.'), 404);
+ return;
+ }
+
+ $cur = common_current_user();
+
+ if (!$cur || $cur->id != $user->id) {
+ $this->client_error(_('Only the user can read their own mailboxes.'), 403);
+ return;
+ }
+
+ $profile = $user->getProfile();
+
+ if (!$profile) {
+ $this->server_error(_('User has no profile.'));
+ return;
+ }
+
+ $page = $this->trimmed('page');
+
+ if (!$page) {
+ $page = 1;
+ }
+
+ $this->show_page($user, $page);
+ }
+
+ function get_title($user, $page) {
+ return '';
+ }
+
+ function show_page($user, $page) {
+
+ common_show_header($this->get_title(),
+ NULL, $user,
+ array($this, 'show_top'));
+
+ $this->show_box($user, $page);
+
+ common_show_footer();
+ }
+
+ function show_box($user, $page) {
+
+ $message = $this->get_messages($user, $page);
+
+ if ($message) {
+
+ $cnt = 0;
+ common_element_start('ul', array('id' => 'messages'));
+
+ while ($message->fetch() && $cnt <= MESSAGES_PER_PAGE) {
+ $cnt++;
+
+ if ($cnt > MESSAGES_PER_PAGE) {
+ break;
+ }
+
+ $this->show_message($message);
+ }
+
+ common_element_end('ul');
+
+ common_pagination($page > 1, $cnt > MESSAGES_PER_PAGE,
+ $page, $this->trimmed('action'),
+ array('nickname' => $user->nickname));
+
+ $message->free();
+ unset($message);
+ }
+ }
+
+ # returns the profile we want to show with the message
+
+ function get_message_profile($message) {
+ return NULL;
+ }
+
+ function show_message($message) {
+
+ common_element_start('li', array('class' => 'message_single',
+ 'id' => 'message-' . $message->id));
+
+ $profile = $this->get_message_profile($message);
+
+ $avatar = $profile->getAvatar(AVATAR_STREAM_SIZE);
+ common_element_start('a', array('href' => $profile->profileurl));
+ common_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));
+ common_element_end('a');
+ common_element('a', array('href' => $profile->profileurl,
+ 'class' => 'nickname'),
+ $profile->nickname);
+ # FIXME: URL, image, video, audio
+ common_element_start('p', array('class' => 'content'));
+ common_raw($message->rendered);
+ common_element_end('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;
+ }
+ common_element_start('p', 'time');
+ common_element('a', array('class' => 'permalink',
+ 'href' => $messageurl,
+ 'title' => common_exact_date($message->created)),
+ common_date_string($message->created));
+ if ($message->source) {
+ common_text(_(' from '));
+ $this->source_link($message->source);
+ }
+
+ common_element_end('p');
+
+ common_element_end('li');
+ }
+}
diff --git a/lib/personal.php b/lib/personal.php
new file mode 100644
index 000000000..248b4cc6b
--- /dev/null
+++ b/lib/personal.php
@@ -0,0 +1,110 @@
+<?php
+/*
+ * Laconica - a distributed open-source microblogging tool
+ * Copyright (C) 2008, Controlez-Vous, Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+if (!defined('LACONICA')) { exit(1); }
+
+class PersonalAction extends Action {
+
+ function is_readonly() {
+ return true;
+ }
+
+ function handle($args) {
+ parent::handle($args);
+ common_set_returnto($this->self_url());
+ }
+
+ function views_menu() {
+
+ $user = NULL;
+ $action = $this->trimmed('action');
+ $nickname = $this->trimmed('nickname');
+
+ if ($nickname) {
+ $user = User::staticGet('nickname', $nickname);
+ $user_profile = $user->getProfile();
+ } else {
+ $user_profile = false;
+ }
+
+ common_element_start('ul', array('id' => 'nav_views'));
+
+ common_menu_item(common_local_url('all', array('nickname' =>
+ $nickname)),
+ _('Personal'),
+ sprintf(_('%s and friends'), (($user_profile && $user_profile->fullname) ? $user_profile->fullname : $nickname)),
+ $action == 'all');
+ common_menu_item(common_local_url('replies', array('nickname' =>
+ $nickname)),
+ _('Replies'),
+ sprintf(_('Replies to %s'), (($user_profile && $user_profile->fullname) ? $user_profile->fullname : $nickname)),
+ $action == 'replies');
+ common_menu_item(common_local_url('showstream', array('nickname' =>
+ $nickname)),
+ _('Profile'),
+ ($user_profile && $user_profile->fullname) ? $user_profile->fullname : $nickname,
+ $action == 'showstream');
+ common_menu_item(common_local_url('showfavorites', array('nickname' =>
+ $nickname)),
+ _('Favorites'),
+ sprintf(_('%s\'s favorite notices'), ($user_profile) ? $user_profile->getBestName() : _('User')),
+ $action == 'showfavorites');
+
+ $cur = common_current_user();
+
+ if ($cur && $cur->id == $user->id) {
+
+ common_menu_item(common_local_url('inbox', array('nickname' =>
+ $nickname)),
+ _('Inbox'),
+ _('Your incoming messages'),
+ $action == 'inbox');
+ common_menu_item(common_local_url('outbox', array('nickname' =>
+ $nickname)),
+ _('Outbox'),
+ _('Your sent messages'),
+ $action == 'outbox');
+ }
+
+ common_element_end('ul');
+ }
+
+ function source_link($source) {
+ $source_name = _($source);
+ switch ($source) {
+ case 'web':
+ case 'xmpp':
+ case 'mail':
+ case 'omb':
+ case 'api':
+ common_element('span', 'noticesource', $source_name);
+ break;
+ default:
+ $ns = Notice_source::staticGet($source);
+ if ($ns) {
+ common_element('a', array('href' => $ns->url),
+ $ns->name);
+ } else {
+ common_element('span', 'noticesource', $source_name);
+ }
+ break;
+ }
+ return;
+ }
+} \ No newline at end of file
diff --git a/lib/stream.php b/lib/stream.php
index f41c125ca..8a2c1e9b0 100644
--- a/lib/stream.php
+++ b/lib/stream.php
@@ -19,54 +19,9 @@
if (!defined('LACONICA')) { exit(1); }
-class StreamAction extends Action {
+require_once(INSTALLDIR.'/lib/personal.php');
- function is_readonly() {
- return true;
- }
-
- function handle($args) {
- parent::handle($args);
- common_set_returnto($this->self_url());
- }
-
- function views_menu() {
-
- $user = NULL;
- $action = $this->trimmed('action');
- $nickname = $this->trimmed('nickname');
-
- if ($nickname) {
- $user = User::staticGet('nickname', $nickname);
- $user_profile = $user->getProfile();
- } else {
- $user_profile = false;
- }
-
- common_element_start('ul', array('id' => 'nav_views'));
-
- common_menu_item(common_local_url('all', array('nickname' =>
- $nickname)),
- _('Personal'),
- sprintf(_('%s and friends'), (($user_profile && $user_profile->fullname) ? $user_profile->fullname : $nickname)),
- $action == 'all');
- common_menu_item(common_local_url('replies', array('nickname' =>
- $nickname)),
- _('Replies'),
- sprintf(_('Replies to %s'), (($user_profile && $user_profile->fullname) ? $user_profile->fullname : $nickname)),
- $action == 'replies');
- common_menu_item(common_local_url('showstream', array('nickname' =>
- $nickname)),
- _('Profile'),
- ($user_profile && $user_profile->fullname) ? $user_profile->fullname : $nickname,
- $action == 'showstream');
- common_menu_item(common_local_url('showfavorites', array('nickname' =>
- $nickname)),
- _('Favorites'),
- sprintf(_('%s\'s favorite notices'), ($user_profile) ? $user_profile->getBestName() : _('User')),
- $action == 'showfavorites');
- common_element_end('ul');
- }
+class StreamAction extends PersonalAction {
function show_notice($notice) {
global $config;
@@ -148,27 +103,4 @@ class StreamAction extends Action {
common_element_end('p');
common_element_end('li');
}
-
- function source_link($source) {
- $source_name = _($source);
- switch ($source) {
- case 'web':
- case 'xmpp':
- case 'mail':
- case 'omb':
- case 'api':
- common_element('span', 'noticesource', $source_name);
- break;
- default:
- $ns = Notice_source::staticGet($source);
- if ($ns) {
- common_element('a', array('href' => $ns->url),
- $ns->name);
- } else {
- common_element('span', 'noticesource', $source_name);
- }
- break;
- }
- return;
- }
}
diff --git a/lib/util.php b/lib/util.php
index 55fb124f8..f0aabfa29 100644
--- a/lib/util.php
+++ b/lib/util.php
@@ -869,6 +869,8 @@ function common_fancy_url($action, $args=NULL) {
case 'subscribers':
case 'all':
case 'replies':
+ case 'inbox':
+ case 'outbox':
if ($args && isset($args['page'])) {
return common_path($args['nickname'].'/'.$action.'?page=' . $args['page']);
} else {
diff --git a/theme/stoica/display.css b/theme/stoica/display.css
index a6de393bf..c35ee56a5 100644
--- a/theme/stoica/display.css
+++ b/theme/stoica/display.css
@@ -714,3 +714,54 @@ font-size: 80%;
p.tagcloud a.smallest {
font-size: 60%;
}
+
+/* ----- Mailbox ----- */
+
+#messages {
+ clear: both;
+ margin: 0 auto;
+ padding: 0;
+ list-style-type: none;
+ width: 540px;
+ border-top: 1px solid #D8E2D7;
+ }
+
+#messages a:hover {
+ text-decoration: underline;
+ }
+
+.message_single {
+ clear: both;
+ display: block;
+ margin: 0;
+ padding: 5px 5px 5px 0;
+ min-height: 48px;
+ font-family: Georgia, "Times New Roman", Times, serif;
+ font-size: 13px;
+ line-height: 16px;
+ border-bottom: 1px solid #D8E2D7;
+ }
+.message_single:hover {
+ background-color: #F3F8EA;
+ }
+.message_single p {
+ display: inline;
+ margin: 0;
+ padding: 0;
+ }
+
+.avatar.stream {
+ float: left;
+ margin: 0 10px 0 0;
+ }
+
+p.time {
+ display: block;
+ font-family: Verdana, Arial, Helvetica, sans-serif;
+ font-size: 10px;
+ line-height: 15px;
+ }
+
+p.time a {
+ color: #91AA9D;
+ }