]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
twiddle a few bits to make replies work correctly
authorEvan Prodromou <evan@prodromou.name>
Mon, 7 Jul 2008 05:43:58 +0000 (01:43 -0400)
committerEvan Prodromou <evan@prodromou.name>
Mon, 7 Jul 2008 05:43:58 +0000 (01:43 -0400)
darcs-hash:20080707054358-84dde-916977a2af4f792e0dc9e02a9f5344ec60911319.gz

actions/newnotice.php
actions/replies.php
classes/Profile.php
classes/User.php
lib/stream.php
lib/util.php
xmppdaemon.php

index 607f4b087101c2a70506e8b69b8a3a24ee39fd7a..0045d6c745e01b087966e0000f6907897de1ab0c 100644 (file)
@@ -75,8 +75,8 @@ class NewnoticeAction extends Action {
                }
 
         common_save_replies($notice);  
-
                common_broadcast_notice($notice);
+               
                $returnto = $this->trimmed('returnto');
                if ($returnto) {
                        $url = common_local_url($returnto,
index 14f19cd765c72138a8d830449865680bdfa4b785..29d01c4c9d9fff6209cc85a592f3db223c88c927 100644 (file)
@@ -44,7 +44,7 @@ class RepliesAction extends StreamAction {
 
                # Looks like we're good; show the header
 
-               common_show_header($profile->nickname . _t(" and friends"),
+               common_show_header(_t("Replies to ") . $profile->nickname,
                                                   array($this, 'show_header'), $user,
                                                   array($this, 'show_top'));
                
@@ -55,23 +55,21 @@ class RepliesAction extends StreamAction {
        
        function show_header($user) {
                common_element('link', array('rel' => 'alternate',
-                                                                        'href' => common_local_url('allrss', array('nickname' =>
-                                                                                                                                                          $user->nickname)),
+                                                                        'href' => common_local_url('repliesrss', array('nickname' =>
+                                                                                                                                                                       $user->nickname)),
                                                                         'type' => 'application/rss+xml',
-                                                                        'title' => _t('Feed for friends of ') . $user->nickname));
+                                                                        'title' => _t('Feed for replies to ') . $user->nickname));
        }
 
        function show_top($user) {
-               $cur = common_current_user();
-               
                $this->views_menu();
        }
        
        function show_replies($profile) {
 
-               $reply = DB_DataObject::factory('reply');
+               $reply = new Reply();
 
-                $reply->user_id = $profile->id;
+               $reply->profile_id = $profile->id;
 
                $reply->orderBy('created DESC');
 
@@ -83,11 +81,14 @@ class RepliesAction extends StreamAction {
 
                if ($cnt > 0) {
                        common_element_start('ul', array('id' => 'replies'));
-                       for ($i = 0; $i < min($cnt, REPLIES_PER_PAGE); $i++) {
+                       for ($i = 0; $i < min($cnt, NOTICES_PER_PAGE); $i++) {
                                if ($reply->fetch()) {
-                                        $notice = DB_DataObject::factory('notice');
-                                        $notice->id = $reply->notice_id;
-                                        $notice->find(1);
+                                       $notice = new Notice();
+                                       $notice->id = $reply->notice_id;
+                                       $result = $notice->find(true);
+                                       if (!$result) {
+                                               continue;
+                                       }
                                        $this->show_reply($notice, $reply->replied_id);
                                } else {
                                        // shouldn't happen!
@@ -97,7 +98,7 @@ class RepliesAction extends StreamAction {
                        common_element_end('ul');
                }
                
-               common_pagination($page > 1, $cnt > REPLIES_PER_PAGE,
+               common_pagination($page > 1, $cnt > NOTICES_PER_PAGE,
                                                  $page, 'all', array('nickname' => $profile->nickname));
        }
 }
index 000590a98fa34380a92a9934fa1669e85718a52e..f41acad4c89aa1d563cf2603f7cf75a791a15788 100644 (file)
@@ -137,4 +137,19 @@ class Profile extends DB_DataObject
        function getBestName() {
                return ($this->fullname) ? $this->fullname : $this->nickname;
        }
+
+    # Get latest notice on or before date; default now
+       function getCurrentNotice($dt=NULL) {
+               $notice = new Notice();
+               $notice->profile_id = $this->id;
+               if ($dt) {
+                       $notice->whereAdd('created < "' . $dt . '"');
+               }
+               $notice->orderBy('created DESC');
+               $notice->limit(1);
+               if ($notice->find(true)) {
+                       return $notice;
+               }
+               return NULL;
+       }
 }
index b22e486f38fe0cdda1c9b2861f532624d35f8f92..c5119de15f7e2b5219ccbc341f0f3cd81116f4c3 100644 (file)
@@ -95,17 +95,8 @@ class User extends DB_DataObject
                return !in_array($nickname, $merged);
        }
 
-        function getCurrentNotice() {
-                $notice = DB_DataObject::factory('notice');
-                $profile = $this->getProfile();
-                $notice->profile_id = $profile->id;
-                $notice->limit(1);
-                $notice->orderBy('created DESC');
-                if ($notice->find()) {
-                        $notice->fetch();
-                        return $notice;
-                }
-                return NULL;
-        }
-
+       function getCurrentNotice($dt=NULL) {
+               $profile = $this->getProfile();
+               return $profile->getCurrentNotice($dt);
+       }
 }
index 6bba0eace3bca74a623b0dfc574f10109f356dac..e29b64c60742b25df8a8c003cce5f59e6c14a433 100644 (file)
@@ -20,7 +20,6 @@
 if (!defined('LACONICA')) { exit(1); }
 
 define('NOTICES_PER_PAGE', 20);
-define('REPLIES_PER_PAGE', 20);
 
 class StreamAction extends Action {
 
@@ -48,7 +47,7 @@ class StreamAction extends Action {
                common_menu_item(common_local_url('replies', array('nickname' =>
                                                                                                                          $nickname)),
                                                 _t('Replies'),  
-                                                ($user && $user->fullname) ? $user->fullname : $nickname,
+                                                _t('Replies to ') . (($user && $user->fullname) ? $user->fullname : $nickname),
                                                 $action == 'replies');
                common_menu_item(common_local_url('showstream', array('nickname' =>
                                                                                                                          $nickname)),
@@ -91,6 +90,8 @@ class StreamAction extends Action {
                common_element_end('li');
        }
 
+       # XXX: these are almost identical functions!
+       
        function show_reply($notice, $replied_id) {
                global $config;
                $profile = $notice->getProfile();
@@ -120,7 +121,7 @@ class StreamAction extends Action {
                common_element('a', array('class' => 'notice',
                                                                  'href' => $noticeurl),
                                           common_date_string($notice->created));
-               common_element('a', array('class' => 'notice',
+               common_element('a', array('class' => 'inreplyto',
                                                                  'href' => $replyurl),
                                           " in reply to ".$profile->nickname );
                common_element_end('p');
index f540596aad6a799a91c9088805c98930e3995151..6130b275d8616894555166003a4a3ea24b530037 100644 (file)
@@ -578,34 +578,48 @@ function common_render_content($text, $notice) {
 }
 
 function common_at_link($sender_id, $nickname) {
+       $sender = Profile::staticGet($sender_id);
+       $recipient = common_relative_profile($sender, $nickname);
+       if ($recipient) {
+               return '<a href="'.htmlspecialchars($recipient->profileurl).'" class="atlink">'.$nickname.'</a>';
+       } else {
+               return $nickname;
+       }
+}
+
+function common_relative_profile($sender, $nickname, $dt) {
        # Try to find profiles this profile is subscribed to that have this nickname
        $recipient = new Profile();
-       # XXX: chokety and bad
+       # XXX: use a join instead of a subquery
        $recipient->whereAdd('EXISTS (SELECT subscribed from subscription where subscriber = '.$sender_id.' and subscribed = id)', 'AND');
        $recipient->whereAdd('nickname = "' . trim($nickname) . '"', 'AND');
        if ($recipient->find(TRUE)) {
-               return '<a href="'.htmlspecialchars($recipient->profileurl).'" class="atlink tolistenee">'.$nickname.'</a>';
+               # XXX: should probably differentiate between profiles with
+               # the same name by date of most recent update
+               return $recipient;
        }
        # Try to find profiles that listen to this profile and that have this nickname
        $recipient = new Profile();
-       # XXX: chokety and bad
+       # XXX: use a join instead of a subquery
        $recipient->whereAdd('EXISTS (SELECT subscriber from subscription where subscribed = '.$sender_id.' and subscriber = id)', 'AND');
        $recipient->whereAdd('nickname = "' . trim($nickname) . '"', 'AND');
        if ($recipient->find(TRUE)) {
-               return '<a href="'.htmlspecialchars($recipient->profileurl).'" class="atlink tolistener">'.$nickname.'</a>';
+               # XXX: should probably differentiate between profiles with
+               # the same name by date of most recent update
+               return $recipient;
        }
        # If this is a local user, try to find a local user with that nickname.
-       $sender = User::staticGet($sender_id);
+       $sender = User::staticGet($sender->id);
        if ($sender) {
                $recipient_user = User::staticGet('nickname', $nickname);
                if ($recipient_user) {
-                       return '<a href="'.htmlspecialchars(common_profile_url($nickname)).'" class="atlink usertouser">'.$nickname.'</a>';
+                       return $recipient_user->getProfile();
                }
        }
        # Otherwise, no links. @messages from local users to remote users,
        # or from remote users to other remote users, are just
        # outside our ability to make intelligent guesses about
-       return $nickname;
+       return NULL;
 }
 
 // where should the avatar go for this user?
@@ -810,35 +824,35 @@ function common_redirect($url, $code=307) {
 }
 
 function common_save_replies($notice) {
-        # extract all @messages
-        preg_match_all('/(?:^|\s)@([a-z0-9]{1,64})/', $notice->content, $match);
-        $current_user = common_current_user();
-        $sender = $current_user->getProfile();
-        #store replied only for first @ (what user/notice what the reply directed, we assume first @ is it)
-        $reply_for = User::staticGet('nickname', $match[1][0]);
-        for ($i=0; $i<count($match[1]); $i++) {
-                $nickname = $match[1][$i];
-                #don't reply to myself
-                if ($sender->nickname == $nickname) {
-                    continue;
-                }
-                $reply = DB_DataObject::factory('reply');
-                $reply->notice_id = $notice->id;
-                $recipient_user = User::staticGet('nickname', $nickname);
-                #if recipient doesn't exist, skip
-                if (!$recipient_user) {
-                      continue;
-                }
-                $reply->user_id = $recipient_user->id;
-                $reply->created = DB_DataObject_Cast::dateTime();
-                $recipient_notice = $reply_for->getCurrentNotice();
-                $reply->replied_id = $recipient_notice->id;
-                $id = $reply->insert();
-                if (!$id) {
-                    common_server_error(_t('Problem saving reply.'));
-                    return;
-                }
-        }
+       # extract all @messages
+       $cnt = preg_match_all('/(?:^|\s)@([a-z0-9]{1,64})/', $notice->content, $match);
+       if (!$cnt) {
+               return true;
+       }
+       $sender = Profile::staticGet($notice->profile_id);
+       # store replied only for first @ (what user/notice what the reply directed,
+       # we assume first @ is it)
+       for ($i=0; $i<count($match[1]); $i++) {
+               $nickname = $match[1][$i];
+               $recipient = common_relative_profile($sender, $nickname, $notice->created);
+               if (!$recipient) {
+                       continue;
+               }
+               if ($i == 0) {
+                       $reply_for = $recipient;
+               }
+               $reply = new Reply();
+               $reply->notice_id = $notice->id;
+               $reply->profile_id = $recipient->id;
+               $reply->created = DB_DataObject_Cast::dateTime();
+               $recipient_notice = $reply_for->getCurrentNotice($notice->created);
+               $reply->replied_id = $recipient_notice->id;
+               $id = $reply->insert();
+               if (!$id) {
+                       common_server_error(_t('Problem saving reply.'));
+                       return;
+               }
+       }
 }
 
 function common_broadcast_notice($notice, $remote=false) {
index 85810fdbf09a8cce1faa5f01d3df7280e24bc6fd..6509ed1faf4d51f57510baf853aed472d3f6d469 100755 (executable)
@@ -204,6 +204,7 @@ class XMPPDaemon {
                        return;
                }
                $notice->query('COMMIT');
+        common_save_replies($notice);  
                common_real_broadcast($notice);
                $this->log(LOG_INFO,
                                   'Added notice ' . $notice->id . ' from user ' . $user->nickname);