]> git.mxchange.org Git - friendica.git/commitdiff
Improve forum delivery, avoid false distribution
authorMichael <heluecht@pirati.ca>
Sun, 6 Jun 2021 19:28:47 +0000 (19:28 +0000)
committerMichael <heluecht@pirati.ca>
Sun, 6 Jun 2021 19:28:47 +0000 (19:28 +0000)
src/Protocol/ActivityPub/Receiver.php
src/Worker/Notifier.php

index 34d45d5ab8d59e923a12ede9d98843a3809e99a2..8e1f3853a579f8660814f40a75884e68600f98cb 100644 (file)
@@ -663,13 +663,14 @@ class Receiver
                }
 
                if (!empty($actor)) {
-                       $profile = APContact::getByURL($actor);
+                       $profile   = APContact::getByURL($actor);
                        $followers = $profile['followers'] ?? '';
-
-                       Logger::log('Actor: ' . $actor . ' - Followers: ' . $followers, Logger::DEBUG);
+                       $is_forum  = $actor['type'] == 'Group';
+                       Logger::info('Got actor and followers', ['actor' => $actor, 'followers' => $followers]);
                } else {
                        Logger::info('Empty actor', ['activity' => $activity]);
                        $followers = '';
+                       $is_forum  = false;
                }
 
                // We have to prevent false follower assumptions upon thread completions
@@ -692,7 +693,7 @@ class Receiver
                                }
 
                                // Fetch the receivers for the public and the followers collection
-                               if (in_array($receiver, [$followers, self::PUBLIC_COLLECTION]) && !empty($actor)) {
+                               if ((($receiver == $followers) || (($receiver == self::PUBLIC_COLLECTION) && !$is_forum)) && !empty($actor)) {
                                        $receivers = self::getReceiverForActor($actor, $tags, $receivers, $follower_target);
                                        continue;
                                }
index 4af1bc91484777ecb628ca0253414242e318a3f0..550b3a4739d0019a28213b85fd4c597e3d2385e4 100644 (file)
@@ -42,6 +42,7 @@ use Friendica\Protocol\OStatus;
 use Friendica\Protocol\Relay;
 use Friendica\Protocol\Salmon;
 use Friendica\Util\Network;
+use Friendica\Util\Strings;
 
 /*
  * The notifier is typically called with:
@@ -249,6 +250,20 @@ class Notifier
                                $direct_forum_delivery = true;
                        }
 
+                       $exclusive_delivery = false;
+
+                       $exclusive_targets = Tag::getByURIId($parent['uri-id'], [Tag::EXCLUSIVE_MENTION]);
+                       if (!empty($exclusive_targets)) {
+                               $exclusive_delivery = true;
+                               Logger::info('Possible Exclusively delivering', ['uid' => $target_item['uid'], 'guid' => $target_item['guid'], 'uri-id' => $target_item['uri-id']]);
+                               foreach ($exclusive_targets as $target) {
+                                       if (Strings::compareLink($owner['url'], $target['url'])) {
+                                               $exclusive_delivery = false;
+                                               Logger::info('False Exclusively delivering', ['uid' => $target_item['uid'], 'guid' => $target_item['guid'], 'uri-id' => $target_item['uri-id'], 'url' => $target['url']]);
+                                       }
+                               }
+                       }
+
                        if ($relay_to_owner) {
                                // local followup to remote post
                                $followup = true;
@@ -283,14 +298,14 @@ class Notifier
                                }
 
                                Logger::log('Notify ' . $target_item["guid"] .' via PuSH: ' . ($push_notify ? "Yes":"No"), Logger::DEBUG);
-                       } elseif ($targets = Tag::getByURIId($target_item['uri-id'], [Tag::EXCLUSIVE_MENTION])) {
+                       } elseif ($exclusive_delivery) {
                                $followup = true;
 
-                               foreach ($targets as $target) {
+                               foreach ($exclusive_targets as $target) {
                                        $cid = Contact::getIdForURL($target['url'], $uid, false);
                                        if ($cid) {
                                                $recipients_followup[] = $cid;
-                                               Logger::info('Exclusively delivering', ['guid' => $target_item['guid'], 'uri-id' => $target_item['uri-id'], 'url' => $target['url']]);
+                                               Logger::info('Exclusively delivering', ['uid' => $target_item['uid'], 'guid' => $target_item['guid'], 'uri-id' => $target_item['uri-id'], 'url' => $target['url']]);
                                        }
                                }
                        } else {