From 44f7ad612aef2f113c5e265064475d801196d13e Mon Sep 17 00:00:00 2001 From: Joshua Judson Rosen Date: Sun, 29 Jul 2012 18:17:16 -0400 Subject: [PATCH] Correctly distribute notices from remote posters through local groups to remote group-members via OStatus. Allow the OStatus queue-handler to handle all posts, and give it the smarts required to make correct decisions about whether it should or shouldn't relay notices over OStatus. cf. http://status.net/open-source/issues/3540 Conflicts (staticGet => getKV): plugins/OStatus/lib/ostatusqueuehandler.php --- plugins/OStatus/OStatusPlugin.php | 18 +++---- plugins/OStatus/lib/ostatusqueuehandler.php | 55 +++++++++++++-------- 2 files changed, 41 insertions(+), 32 deletions(-) diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index 82e059c0fa..be9be1838e 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -125,18 +125,14 @@ class OStatusPlugin extends Plugin */ function onStartEnqueueNotice($notice, &$transports) { - if ($notice->isLocal()) { - if ($notice->inScope(null)) { - // put our transport first, in case there's any conflict (like OMB) - array_unshift($transports, 'ostatus'); - $this->log(LOG_INFO, "Notice {$notice->id} queued for OStatus processing"); - } else { - // FIXME: we don't do privacy-controlled OStatus updates yet. - // once that happens, finer grain of control here. - $this->log(LOG_NOTICE, "Not queueing notice {$notice->id} for OStatus because of privacy; scope = {$notice->scope}"); - } + if ($notice->inScope(null)) { + // put our transport first, in case there's any conflict (like OMB) + array_unshift($transports, 'ostatus'); + $this->log(LOG_INFO, "Notice {$notice->id} queued for OStatus processing"); } else { - $this->log(LOG_NOTICE, "Not queueing notice {$notice->id} for OStatus because it's not local."); + // FIXME: we don't do privacy-controlled OStatus updates yet. + // once that happens, finer grain of control here. + $this->log(LOG_NOTICE, "Not queueing notice {$notice->id} for OStatus because of privacy; scope = {$notice->scope}"); } return true; } diff --git a/plugins/OStatus/lib/ostatusqueuehandler.php b/plugins/OStatus/lib/ostatusqueuehandler.php index b2e8401128..3e9c4828fb 100644 --- a/plugins/OStatus/lib/ostatusqueuehandler.php +++ b/plugins/OStatus/lib/ostatusqueuehandler.php @@ -60,40 +60,53 @@ class OStatusQueueHandler extends QueueHandler return true; } - $this->pushUser(); + 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->getGroups() as $group) { $oprofile = Ostatus_profile::getKV('group_id', $group->id); if ($oprofile) { - $this->pingReply($oprofile); + // remote group + if ($notice->isLocal()) { + $this->pingReply($oprofile); + } } else { + // local group $this->pushGroup($group->id); } } - - foreach ($notice->getReplies() as $profile_id) { - $oprofile = Ostatus_profile::getKV('profile_id', $profile_id); - if ($oprofile) { - $this->pingReply($oprofile); - } - } - if (!empty($this->notice->reply_to)) { - $replyTo = Notice::getKV('id', $this->notice->reply_to); - if (!empty($replyTo)) { - foreach($replyTo->getReplies() as $profile_id) { - $oprofile = Ostatus_profile::getKV('profile_id', $profile_id); - if ($oprofile) { - $this->pingReply($oprofile); + if ($notice->isLocal()) { + // Notices generated on other sites will have already + // pinged their reply-targets. + + foreach ($notice->getReplies() as $profile_id) { + $oprofile = Ostatus_profile::getKV('profile_id', $profile_id); + if ($oprofile) { + $this->pingReply($oprofile); + } + } + + if (!empty($this->notice->reply_to)) { + $replyTo = Notice::getKV('id', $this->notice->reply_to); + if (!empty($replyTo)) { + foreach($replyTo->getReplies() as $profile_id) { + $oprofile = Ostatus_profile::getKV('profile_id', $profile_id); + if ($oprofile) { + $this->pingReply($oprofile); + } } } } - } - foreach ($notice->getProfileTags() as $ptag) { - $oprofile = Ostatus_profile::getKV('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); + } } }