X-Git-Url: https://git.mxchange.org/?p=quix0rs-gnu-social.git;a=blobdiff_plain;f=plugins%2FOStatus%2Flib%2Fostatusqueuehandler.php;h=a4d9e527e2afed5459ba8120277f4e7b0b77298d;hp=f5284057e3a85028f4fa290552fa544e8536be42;hb=c18020561b8a01bbb2b3fc092694a7bb0fde70f9;hpb=0cbb7411a69f63a4c2947d5c66e62f28e0714532 diff --git a/plugins/OStatus/lib/ostatusqueuehandler.php b/plugins/OStatus/lib/ostatusqueuehandler.php index f5284057e3..a4d9e527e2 100644 --- a/plugins/OStatus/lib/ostatusqueuehandler.php +++ b/plugins/OStatus/lib/ostatusqueuehandler.php @@ -51,7 +51,7 @@ class OStatusQueueHandler extends QueueHandler assert($notice instanceof Notice); $this->notice = $notice; - $this->user = User::staticGet('id', $notice->profile_id); + $this->user = User::getKV('id', $notice->profile_id); try { $profile = $this->notice->getProfile(); @@ -60,40 +60,70 @@ class OStatusQueueHandler extends QueueHandler return true; } - $this->pushUser(); - - 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::staticGet('peopletag_id', $ptag->id); - if (!$oprofile) { - $this->pushPeopletag($ptag); + foreach ($notice->getProfileTags() as $ptag) { + $oprofile = Ostatus_profile::getKV('peopletag_id', $ptag->id); + if (!$oprofile) { + $this->pushPeopletag($ptag); + } } } @@ -103,6 +133,7 @@ class OStatusQueueHandler extends QueueHandler 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', @@ -112,18 +143,20 @@ class OStatusQueueHandler extends QueueHandler } } - 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_id); + $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', @@ -133,14 +166,15 @@ class OStatusQueueHandler extends QueueHandler $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()); } } @@ -223,7 +257,7 @@ class OStatusQueueHandler extends QueueHandler } } } - if (count($batch) >= 0) { + if (count($batch) > 0) { $sub->bulkDistribute($atom, $batch); } } @@ -243,7 +277,7 @@ class OStatusQueueHandler extends QueueHandler 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);