assert($notice instanceof Notice);
$this->notice = $notice;
- $this->user = User::staticGet($notice->profile_id);
+ $this->user = User::getKV('id', $notice->profile_id);
- $this->pushUser();
+ try {
+ $profile = $this->notice->getProfile();
+ } catch (Exception $e) {
+ common_log(LOG_ERR, "Can't get profile for notice; skipping: " . $e->getMessage());
+ return true;
+ }
- foreach ($notice->getGroups() as $group) {
- $oprofile = Ostatus_profile::staticGet('group_id', $group->id);
- if ($oprofile) {
- $this->pingReply($oprofile);
- } else {
- $this->pushGroup($group->id);
- }
+ if ($notice->isLocal()) {
+ // Notices generated on remote sites will have already
+ // been pushed to user's subscribers by their origin sites.
+ $this->pushUser();
}
- foreach ($notice->getReplies() as $profile_id) {
- $oprofile = Ostatus_profile::staticGet('profile_id', $profile_id);
- if ($oprofile) {
- $this->pingReply($oprofile);
+ foreach ($notice->getAttentionProfiles() as $target) {
+ common_debug("OSTATUS [{$this->notice->getID()}]: Attention target profile {$target->getNickname()} ({$target->getID()})");
+ if ($target->isGroup()) {
+ common_debug("OSTATUS [{$this->notice->getID()}]: {$target->getID()} is a group");
+ $oprofile = Ostatus_profile::getKV('group_id', $target->getGroup()->getID());
+ if (!$oprofile instanceof Ostatus_profile) {
+ // we don't save profiles like this yet, but in the future
+ $oprofile = Ostatus_profile::getKV('profile_id', $target->getID());
+ }
+ if ($oprofile instanceof Ostatus_profile) {
+ // remote group
+ if ($notice->isLocal()) {
+ common_debug("OSTATUS [{$this->notice->getID()}]: notice is local and remote group with profile ID {$target->getID()} gets a ping");
+ $this->pingReply($oprofile);
+ }
+ } else {
+ common_debug("OSTATUS [{$this->notice->getID()}]: local group with profile id {$target->getID()} gets pushed out");
+ // local group
+ $this->pushGroup($target->getGroup());
+ }
+ } elseif ($notice->isLocal()) {
+ // Notices generated on other sites will have already
+ // pinged their reply-targets, so only do these things
+ // if the target is not a group and the notice is locally generated
+
+ $oprofile = Ostatus_profile::getKV('profile_id', $target->getID());
+ if ($oprofile instanceof Ostatus_profile) {
+ common_debug("OSTATUS [{$this->notice->getID()}]: Notice is local and {$target->getID()} is remote profile, getting pingReply");
+ $this->pingReply($oprofile);
+ }
}
}
- if (!empty($this->notice->reply_to)) {
- $replyTo = Notice::staticGet('id', $this->notice->reply_to);
- if (!empty($replyTo)) {
- foreach($replyTo->getReplies() as $profile_id) {
- $oprofile = Ostatus_profile::staticGet('profile_id', $profile_id);
- if ($oprofile) {
+ if ($notice->isLocal()) {
+ try {
+ $parent = $this->notice->getParent();
+ foreach($parent->getAttentionProfiles() as $related) {
+ if ($related->isGroup()) {
+ // don't ping groups in parent notices since we might not be a member of them,
+ // though it could be useful if we study this and use it correctly
+ continue;
+ }
+ common_debug("OSTATUS [{$this->notice->getID()}]: parent notice {$parent->getID()} has related profile id=={$related->getID()}");
+ // FIXME: don't ping twice in case someone is in both notice attention spans!
+ $oprofile = Ostatus_profile::getKV('profile_id', $related->getID());
+ if ($oprofile instanceof Ostatus_profile) {
$this->pingReply($oprofile);
}
}
+ } catch (NoParentNoticeException $e) {
+ // nothing to do then
+ }
+
+ foreach ($notice->getProfileTags() as $ptag) {
+ $oprofile = Ostatus_profile::getKV('peopletag_id', $ptag->id);
+ if (!$oprofile) {
+ $this->pushPeopletag($ptag);
+ }
}
}
+
return true;
}
function pushUser()
{
if ($this->user) {
+ common_debug("OSTATUS [{$this->notice->getID()}]: pushing feed for local user {$this->user->getID()}");
// For local posts, ping the PuSH hub to update their feed.
// http://identi.ca/api/statuses/user_timeline/1.atom
$feed = common_local_url('ApiTimelineUser',
}
}
- function pushGroup($group_id)
+ function pushGroup(User_group $group)
{
+ common_debug("OSTATUS [{$this->notice->getID()}]: pushing group '{$group->getNickname()}' profile_id={$group->profile_id}");
// For a local group, ping the PuSH hub to update its feed.
// Updates may come from either a local or a remote user.
$feed = common_local_url('ApiTimelineGroup',
- array('id' => $group_id,
+ array('id' => $group->getID(),
+ 'format' => 'atom'));
+ $this->pushFeed($feed, array($this, 'groupFeedForNotice'), $group->getID());
+ }
+
+ function pushPeopletag($ptag)
+ {
+ common_debug("OSTATUS [{$this->notice->getID()}]: pushing peopletag '{$ptag->id}'");
+ // For a local people tag, ping the PuSH hub to update its feed.
+ // Updates may come from either a local or a remote user.
+ $feed = common_local_url('ApiTimelineList',
+ array('id' => $ptag->id,
+ 'user' => $ptag->tagger,
'format' => 'atom'));
- $this->pushFeed($feed, array($this, 'groupFeedForNotice'), $group_id);
+ $this->pushFeed($feed, array($this, 'peopletagFeedForNotice'), $ptag);
}
- function pingReply($oprofile)
+ function pingReply(Ostatus_profile $oprofile)
{
if ($this->user) {
+ common_debug("OSTATUS [{$this->notice->getID()}]: pinging reply to {$oprofile->localProfile()->getNickname()} for local user '{$this->user->getID()}'");
// For local posts, send a Salmon ping to the mentioned
// remote user or group.
// @fixme as an optimization we can skip this if the
// remote profile is subscribed to the author.
- $oprofile->notifyDeferred($this->notice, $this->user);
+ $oprofile->notifyDeferred($this->notice, $this->user->getProfile());
}
}
}
}
}
- if (count($batch) >= 0) {
+ if (count($batch) > 0) {
$sub->bulkDistribute($atom, $batch);
}
}
function groupFeedForNotice($group_id)
{
- $group = User_group::staticGet('id', $group_id);
+ $group = User_group::getKV('id', $group_id);
$atom = new AtomGroupNoticeFeed($group);
$atom->addEntryFromNotice($this->notice);
return $feed;
}
+
+ function peopletagFeedForNotice($ptag)
+ {
+ $atom = new AtomListNoticeFeed($ptag);
+ $atom->addEntryFromNotice($this->notice);
+ $feed = $atom->getString();
+
+ return $feed;
+ }
}