]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
inbox and outbox for direct messages
authorEvan Prodromou <evan@prodromou.name>
Tue, 16 Sep 2008 19:53:46 +0000 (15:53 -0400)
committerEvan Prodromou <evan@prodromou.name>
Tue, 16 Sep 2008 19:53:46 +0000 (15:53 -0400)
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

actions/inbox.php [new file with mode: 0644]
actions/outbox.php [new file with mode: 0644]
classes/Message.php
htaccess.sample
lib/mailbox.php [new file with mode: 0644]
lib/personal.php [new file with mode: 0644]
lib/stream.php
lib/util.php
theme/stoica/display.css

diff --git a/actions/inbox.php b/actions/inbox.php
new file mode 100644 (file)
index 0000000..73155ef
--- /dev/null
@@ -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 (file)
index 0000000..b09cd20
--- /dev/null
@@ -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();
+       }
+}
index 3f01e3c8325db33ff5477c702b63003b9fad9710..93ec419d49c5ef6de4590ca0deeb70b0ea861683 100644 (file)
@@ -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);
+       }
 }
index 30f1bb5318296fb38dafca5b5660d8cc25101e18..364c35b079fc47f6ce38e12beb685223ce7b6f80 100644 (file)
@@ -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 (file)
index 0000000..5ad63cb
--- /dev/null
@@ -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 (file)
index 0000000..248b4cc
--- /dev/null
@@ -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
index f41c125ca0d96a5e71dff502e28e61c6d8148cd5..8a2c1e9b08f9b7d481747033a811d2f4c5b20898 100644 (file)
 
 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;
-       }
 }
index 55fb124f8a848aab273c8f1c4ddc8348c8eb2886..f0aabfa29d37981d276cca332924f8600e4fc532 100644 (file)
@@ -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 {
index a6de393bf36987f20bcd65247f5821d6080713d0..c35ee56a5e2f62d3ee12b818694b81afac46a764 100644 (file)
@@ -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;
+       }