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
This commit is contained in:
Joshua Judson Rosen 2012-07-29 18:17:16 -04:00 committed by Mikael Nordfeldth
parent 8e53eb2b4c
commit 44f7ad612a
2 changed files with 41 additions and 32 deletions

View File

@ -125,18 +125,14 @@ class OStatusPlugin extends Plugin
*/ */
function onStartEnqueueNotice($notice, &$transports) function onStartEnqueueNotice($notice, &$transports)
{ {
if ($notice->isLocal()) { if ($notice->inScope(null)) {
if ($notice->inScope(null)) { // put our transport first, in case there's any conflict (like OMB)
// put our transport first, in case there's any conflict (like OMB) array_unshift($transports, 'ostatus');
array_unshift($transports, 'ostatus'); $this->log(LOG_INFO, "Notice {$notice->id} queued for OStatus processing");
$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}");
}
} else { } 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; return true;
} }

View File

@ -60,40 +60,53 @@ class OStatusQueueHandler extends QueueHandler
return true; 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) { foreach ($notice->getGroups() as $group) {
$oprofile = Ostatus_profile::getKV('group_id', $group->id); $oprofile = Ostatus_profile::getKV('group_id', $group->id);
if ($oprofile) { if ($oprofile) {
$this->pingReply($oprofile); // remote group
if ($notice->isLocal()) {
$this->pingReply($oprofile);
}
} else { } else {
// local group
$this->pushGroup($group->id); $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)) { if ($notice->isLocal()) {
$replyTo = Notice::getKV('id', $this->notice->reply_to); // Notices generated on other sites will have already
if (!empty($replyTo)) { // pinged their reply-targets.
foreach($replyTo->getReplies() as $profile_id) {
$oprofile = Ostatus_profile::getKV('profile_id', $profile_id); foreach ($notice->getReplies() as $profile_id) {
if ($oprofile) { $oprofile = Ostatus_profile::getKV('profile_id', $profile_id);
$this->pingReply($oprofile); 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) { foreach ($notice->getProfileTags() as $ptag) {
$oprofile = Ostatus_profile::getKV('peopletag_id', $ptag->id); $oprofile = Ostatus_profile::getKV('peopletag_id', $ptag->id);
if (!$oprofile) { if (!$oprofile) {
$this->pushPeopletag($ptag); $this->pushPeopletag($ptag);
}
} }
} }