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)
{
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;
}

View File

@ -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);
}
}
}