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