From d6794cba2e7047616ba8bcbc1217a4ae7f245d99 Mon Sep 17 00:00:00 2001
From: Joshua Judson Rosen <rozzin@geekspace.com>
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

---
 plugins/OStatus/OStatusPlugin.php           |   18 ++++------
 plugins/OStatus/lib/ostatusqueuehandler.php |   53 +++++++++++++++++----------
 2 files changed, 40 insertions(+), 31 deletions(-)

diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php
index 43b90cf..90e5e9e 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 f528405..74e145b 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::staticGet('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::staticGet('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::staticGet('profile_id', $profile_id);
+                if ($oprofile) {
+                    $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) {
-                        $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) {
+                            $this->pingReply($oprofile);
+                        }
                     }
                 }
             }
-        }
 
-        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::staticGet('peopletag_id', $ptag->id);
+                if (!$oprofile) {
+                    $this->pushPeopletag($ptag);
+                }
             }
         }
 
-- 
1.7.1