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);