summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEvan Prodromou <evan@prodromou.name>2008-09-16 15:53:46 -0400
committerEvan Prodromou <evan@prodromou.name>2008-09-16 15:53:46 -0400
commit7416e50daa6f792f73e47141fa7ac3bfc843b1e0 (patch)
tree4de167e88ce6aad9e9a68b8d956ce9815fc10552
parentd57b39e8a5596e91ffae4d583e18934b807b8e43 (diff)
inbox and outbox for direct messages
Added an inbox and outbox for direct messages. Factored common code to mailbox.php. Factored common code with stream.php to personal.php. darcs-hash:20080916195346-84dde-b5c846f713a970c41fd1b0671cb333e91f3cb920.gz
-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;
+ }