From 8d3ec9c92076e172e5871e3603c143333d73ac3c Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Mon, 7 Jul 2008 01:43:58 -0400 Subject: [PATCH] twiddle a few bits to make replies work correctly darcs-hash:20080707054358-84dde-916977a2af4f792e0dc9e02a9f5344ec60911319.gz --- actions/newnotice.php | 2 +- actions/replies.php | 27 +++++++------- classes/Profile.php | 15 ++++++++ classes/User.php | 17 ++------- lib/stream.php | 7 ++-- lib/util.php | 86 +++++++++++++++++++++++++------------------ xmppdaemon.php | 1 + 7 files changed, 89 insertions(+), 66 deletions(-) diff --git a/actions/newnotice.php b/actions/newnotice.php index 607f4b0871..0045d6c745 100644 --- a/actions/newnotice.php +++ b/actions/newnotice.php @@ -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, diff --git a/actions/replies.php b/actions/replies.php index 14f19cd765..29d01c4c9d 100644 --- a/actions/replies.php +++ b/actions/replies.php @@ -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)); } } diff --git a/classes/Profile.php b/classes/Profile.php index 000590a98f..f41acad4c8 100644 --- a/classes/Profile.php +++ b/classes/Profile.php @@ -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; + } } diff --git a/classes/User.php b/classes/User.php index b22e486f38..c5119de15f 100644 --- a/classes/User.php +++ b/classes/User.php @@ -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); + } } diff --git a/lib/stream.php b/lib/stream.php index 6bba0eace3..e29b64c607 100644 --- a/lib/stream.php +++ b/lib/stream.php @@ -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'); diff --git a/lib/util.php b/lib/util.php index f540596aad..6130b275d8 100644 --- a/lib/util.php +++ b/lib/util.php @@ -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 ''.$nickname.''; + } 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 ''.$nickname.''; + # 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 ''.$nickname.''; + # 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 ''.$nickname.''; + 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; $inickname == $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; $icreated); + 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) { diff --git a/xmppdaemon.php b/xmppdaemon.php index 85810fdbf0..6509ed1faf 100755 --- a/xmppdaemon.php +++ b/xmppdaemon.php @@ -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);