mirror of
https://github.com/friendica/friendica
synced 2024-11-19 11:43:41 +00:00
Merge pull request #10374 from annando/forum-unlisted
Respect the "unlisted" setting for forum posts
This commit is contained in:
commit
5fc988b488
4 changed files with 45 additions and 12 deletions
|
@ -1909,6 +1909,15 @@ class Item
|
|||
return false;
|
||||
}
|
||||
|
||||
self::performActivity($item['id'], 'announce', $uid);
|
||||
|
||||
/**
|
||||
* All the following lines are only needed for private forums and compatibility to older systems without AP support.
|
||||
* A possible way would be that the followers list of a forum would always be readable by all followers.
|
||||
* So this would mean that the comment distribution could be done exactly for the intended audience.
|
||||
* Or possibly we could store the receivers that had been in the "announce" message above and use this.
|
||||
*/
|
||||
|
||||
// now change this copy of the post to a forum head message and deliver to all the tgroup members
|
||||
$self = DBA::selectFirst('contact', ['id', 'name', 'url', 'thumb'], ['uid' => $uid, 'self' => true]);
|
||||
if (!DBA::isResult($self)) {
|
||||
|
@ -1918,8 +1927,13 @@ class Item
|
|||
$owner_id = Contact::getIdForURL($self['url']);
|
||||
|
||||
// also reset all the privacy bits to the forum default permissions
|
||||
|
||||
$private = ($user['allow_cid'] || $user['allow_gid'] || $user['deny_cid'] || $user['deny_gid']) ? self::PRIVATE : self::UNLISTED;
|
||||
if ($user['allow_cid'] || $user['allow_gid'] || $user['deny_cid'] || $user['deny_gid']) {
|
||||
$private = self::PRIVATE;
|
||||
} elseif (DI::pConfig()->get($user['uid'], 'system', 'unlisted')) {
|
||||
$private = self::UNLISTED;
|
||||
} else {
|
||||
$private = self::PUBLIC;
|
||||
}
|
||||
|
||||
$psid = PermissionSet::getIdFromACL(
|
||||
$user['uid'],
|
||||
|
@ -1937,8 +1951,6 @@ class Item
|
|||
|
||||
Worker::add(['priority' => PRIORITY_HIGH, 'dont_fork' => true], 'Notifier', Delivery::POST, (int)$item['uri-id'], (int)$item['uid']);
|
||||
|
||||
self::performActivity($item['id'], 'announce', $uid);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -561,6 +561,9 @@ class Transmitter
|
|||
if (!empty($profile)) {
|
||||
if ($term['type'] == Tag::EXCLUSIVE_MENTION) {
|
||||
$exclusive = true;
|
||||
if (!empty($profile['followers']) && ($profile['type'] == 'Group')) {
|
||||
$data['cc'][] = $profile['followers'];
|
||||
}
|
||||
}
|
||||
$data['to'][] = $profile['url'];
|
||||
}
|
||||
|
@ -618,7 +621,9 @@ class Transmitter
|
|||
}
|
||||
}
|
||||
} elseif (!$exclusive) {
|
||||
// Public thread parent post always are directed to the followers
|
||||
// Public thread parent post always are directed to the followers.
|
||||
// This mustn't be done by posts that are directed to forum servers via the exclusive mention.
|
||||
// But possibly in that case we could add the "followers" collection of the forum to the message.
|
||||
if (($item['private'] != Item::PRIVATE) && !$forum_mode) {
|
||||
$data['cc'][] = $actor_profile['followers'];
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in a new issue