add patch to really federate groups.
diff --git a/really-federate-groups.diff b/really-federate-groups.diff new file mode 100644 --- /dev/null +++ b/really-federate-groups.diff @@ -0,0 +1,125 @@ +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