Replace "forum" by "group" in the rest of the code
This commit is contained in:
		
					parent
					
						
							
								03bebf57c5
							
						
					
				
			
			
				commit
				
					
						3385147f25
					
				
			
		
					 59 changed files with 378 additions and 424 deletions
				
			
		| 
						 | 
				
			
			@ -102,7 +102,7 @@ class Feature
 | 
			
		|||
			// Post composition
 | 
			
		||||
			'composition' => [
 | 
			
		||||
				DI::l10n()->t('Post Composition Features'),
 | 
			
		||||
				['aclautomention', DI::l10n()->t('Auto-mention Forums'), DI::l10n()->t('Add/remove mention when a forum page is selected/deselected in ACL window.'), false, DI::config()->get('feature_lock', 'aclautomention', false)],
 | 
			
		||||
				['aclautomention', DI::l10n()->t('Auto-mention Groups'), DI::l10n()->t('Add/remove mention when a group page is selected/deselected in ACL window.'), false, DI::config()->get('feature_lock', 'aclautomention', false)],
 | 
			
		||||
				['explicit_mentions', DI::l10n()->t('Explicit Mentions'), DI::l10n()->t('Add explicit mentions to comment box for manual control over who gets mentioned in replies.'), false, DI::config()->get('feature_lock', 'explicit_mentions', false)],
 | 
			
		||||
				['add_abstract', DI::l10n()->t('Add an abstract from ActivityPub content warnings'), DI::l10n()->t('Add an abstract when commenting on ActivityPub posts with a content warning. Abstracts are displayed as content warning on systems like Mastodon or Pleroma.'), false, DI::config()->get('feature_lock', 'add_abstract', false)],
 | 
			
		||||
			],
 | 
			
		||||
| 
						 | 
				
			
			@ -116,7 +116,7 @@ class Feature
 | 
			
		|||
			// Advanced Profile Settings
 | 
			
		||||
			'advanced_profile' => [
 | 
			
		||||
				DI::l10n()->t('Advanced Profile Settings'),
 | 
			
		||||
				['forumlist_profile',   DI::l10n()->t('List Forums'),             DI::l10n()->t('Show visitors public community forums at the Advanced Profile Page'), false, DI::config()->get('feature_lock', 'forumlist_profile', false)],
 | 
			
		||||
				['forumlist_profile',   DI::l10n()->t('List Groups'),             DI::l10n()->t('Show visitors public groups at the Advanced Profile Page'), false, DI::config()->get('feature_lock', 'forumlist_profile', false)],
 | 
			
		||||
				['tagadelic',           DI::l10n()->t('Tag Cloud'),               DI::l10n()->t('Provide a personal tag cloud on your profile page'), false, DI::config()->get('feature_lock', 'tagadelic', false)],
 | 
			
		||||
				['profile_membersince', DI::l10n()->t('Display Membership Date'), DI::l10n()->t('Display membership date in profile'), false, DI::config()->get('feature_lock', 'profile_membersince', false)],
 | 
			
		||||
			],
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -29,21 +29,21 @@ use Friendica\DI;
 | 
			
		|||
use Friendica\Model\Contact;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This class handles methods related to the forum functionality
 | 
			
		||||
 * This class handles methods related to the group functionality
 | 
			
		||||
 */
 | 
			
		||||
class ForumManager
 | 
			
		||||
class GroupManager
 | 
			
		||||
{
 | 
			
		||||
	/**
 | 
			
		||||
	 * Function to list all forums a user is connected with
 | 
			
		||||
	 * Function to list all groups a user is connected with
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param int     $uid         of the profile owner
 | 
			
		||||
	 * @param boolean $lastitem    Sort by lastitem
 | 
			
		||||
	 * @param boolean $showhidden  Show forums which are not hidden
 | 
			
		||||
	 * @param boolean $showhidden  Show groups which are not hidden
 | 
			
		||||
	 * @param boolean $showprivate Show private groups
 | 
			
		||||
	 *
 | 
			
		||||
	 * @return array
 | 
			
		||||
	 *    'url'    => forum url
 | 
			
		||||
	 *    'name'    => forum name
 | 
			
		||||
	 *    'url'    => group url
 | 
			
		||||
	 *    'name'    => group name
 | 
			
		||||
	 *    'id'    => number of the key from the array
 | 
			
		||||
	 *    'micro' => contact photo in format micro
 | 
			
		||||
	 *    'thumb' => contact photo in format thumb
 | 
			
		||||
| 
						 | 
				
			
			@ -76,16 +76,16 @@ class ForumManager
 | 
			
		|||
			$condition = DBA::mergeConditions($condition, ['hidden' => false]);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		$forumlist = [];
 | 
			
		||||
		$groupList = [];
 | 
			
		||||
 | 
			
		||||
		$fields = ['id', 'url', 'name', 'micro', 'thumb', 'avatar', 'network', 'uid'];
 | 
			
		||||
		$contacts = DBA::select('account-user-view', $fields, $condition, $params);
 | 
			
		||||
		if (!$contacts) {
 | 
			
		||||
			return($forumlist);
 | 
			
		||||
			return $groupList;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		while ($contact = DBA::fetch($contacts)) {
 | 
			
		||||
			$forumlist[] = [
 | 
			
		||||
			$groupList[] = [
 | 
			
		||||
				'url'	=> $contact['url'],
 | 
			
		||||
				'name'	=> $contact['name'],
 | 
			
		||||
				'id'	=> $contact['id'],
 | 
			
		||||
| 
						 | 
				
			
			@ -95,19 +95,19 @@ class ForumManager
 | 
			
		|||
		}
 | 
			
		||||
		DBA::close($contacts);
 | 
			
		||||
 | 
			
		||||
		return($forumlist);
 | 
			
		||||
		return($groupList);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Forumlist widget
 | 
			
		||||
	 * Group list widget
 | 
			
		||||
	 *
 | 
			
		||||
	 * Sidebar widget to show subscribed friendica forums. If activated
 | 
			
		||||
	 * in the settings, it appears at the notwork page sidebar
 | 
			
		||||
	 * Sidebar widget to show subscribed Friendica groups. If activated
 | 
			
		||||
	 * in the settings, it appears in the network page sidebar
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param string $baseurl Base module path
 | 
			
		||||
	 * @param int    $uid     The ID of the User
 | 
			
		||||
	 * @param int    $cid     The contact id which is used to mark a forum as "selected"
 | 
			
		||||
	 * @param int    $cid     The contact id which is used to mark a group as "selected"
 | 
			
		||||
	 * @return string
 | 
			
		||||
	 * @throws \Friendica\Network\HTTPException\InternalServerErrorException
 | 
			
		||||
	 * @throws \ImagickException
 | 
			
		||||
| 
						 | 
				
			
			@ -121,7 +121,7 @@ class ForumManager
 | 
			
		|||
 | 
			
		||||
		$contacts = self::getList($uid, $lastitem, true, true);
 | 
			
		||||
		$total = count($contacts);
 | 
			
		||||
		$visible_forums = 10;
 | 
			
		||||
		$visibleGroups = 10;
 | 
			
		||||
 | 
			
		||||
		if (DBA::isResult($contacts)) {
 | 
			
		||||
			$id = 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -129,7 +129,7 @@ class ForumManager
 | 
			
		|||
			$entries = [];
 | 
			
		||||
 | 
			
		||||
			foreach ($contacts as $contact) {
 | 
			
		||||
				$selected = (($cid == $contact['id']) ? ' forum-selected' : '');
 | 
			
		||||
				$selected = (($cid == $contact['id']) ? ' group-selected' : '');
 | 
			
		||||
 | 
			
		||||
				$entry = [
 | 
			
		||||
					'url' => $baseurl . '/' . $contact['id'],
 | 
			
		||||
| 
						 | 
				
			
			@ -143,16 +143,16 @@ class ForumManager
 | 
			
		|||
				$entries[] = $entry;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			$tpl = Renderer::getMarkupTemplate('widget_forumlist.tpl');
 | 
			
		||||
			$tpl = Renderer::getMarkupTemplate('widget/group_list.tpl');
 | 
			
		||||
 | 
			
		||||
			$o .= Renderer::replaceMacros(
 | 
			
		||||
				$tpl,
 | 
			
		||||
				[
 | 
			
		||||
					'$title'	=> DI::l10n()->t('Forums'),
 | 
			
		||||
					'$forums'	=> $entries,
 | 
			
		||||
					'$link_desc'	=> DI::l10n()->t('External link to forum'),
 | 
			
		||||
					'$title'	=> DI::l10n()->t('Groups'),
 | 
			
		||||
					'$groups'	=> $entries,
 | 
			
		||||
					'$link_desc'	=> DI::l10n()->t('External link to group'),
 | 
			
		||||
					'$total'	=> $total,
 | 
			
		||||
					'$visible_forums' => $visible_forums,
 | 
			
		||||
					'$visible_groups' => $visibleGroups,
 | 
			
		||||
					'$showless'	=> DI::l10n()->t('show less'),
 | 
			
		||||
					'$showmore'	=> DI::l10n()->t('show more')]
 | 
			
		||||
			);
 | 
			
		||||
| 
						 | 
				
			
			@ -162,9 +162,9 @@ class ForumManager
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Format forumlist as contact block
 | 
			
		||||
	 * Format group list as contact block
 | 
			
		||||
	 *
 | 
			
		||||
	 * This function is used to show the forumlist in
 | 
			
		||||
	 * This function is used to show the group list in
 | 
			
		||||
	 * the advanced profile.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param int $uid The ID of the User
 | 
			
		||||
| 
						 | 
				
			
			@ -181,7 +181,7 @@ class ForumManager
 | 
			
		|||
 | 
			
		||||
		$o = '';
 | 
			
		||||
 | 
			
		||||
		// place holder in case somebody wants configurability
 | 
			
		||||
		// placeholder in case somebody wants configurability
 | 
			
		||||
		$show_total = 9999;
 | 
			
		||||
 | 
			
		||||
		//don't sort by last updated item
 | 
			
		||||
| 
						 | 
				
			
			@ -191,7 +191,7 @@ class ForumManager
 | 
			
		|||
 | 
			
		||||
		$total_shown = 0;
 | 
			
		||||
		foreach ($contacts as $contact) {
 | 
			
		||||
			$o .= HTML::micropro($contact, true, 'forumlist-profile-advanced');
 | 
			
		||||
			$o .= HTML::micropro($contact, true, 'grouplist-profile-advanced');
 | 
			
		||||
			$total_shown++;
 | 
			
		||||
			if ($total_shown == $show_total) {
 | 
			
		||||
				break;
 | 
			
		||||
| 
						 | 
				
			
			@ -202,14 +202,14 @@ class ForumManager
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * count unread forum items
 | 
			
		||||
	 * count unread group items
 | 
			
		||||
	 *
 | 
			
		||||
	 * Count unread items of connected forums and private groups
 | 
			
		||||
	 * Count unread items of connected groups and private groups
 | 
			
		||||
	 *
 | 
			
		||||
	 * @return array
 | 
			
		||||
	 *    'id' => contact id
 | 
			
		||||
	 *    'name' => contact/forum name
 | 
			
		||||
	 *    'count' => counted unseen forum items
 | 
			
		||||
	 *    'name' => contact/group name
 | 
			
		||||
	 *    'count' => counted unseen group items
 | 
			
		||||
	 * @throws \Exception
 | 
			
		||||
	 */
 | 
			
		||||
	public static function countUnseenItems()
 | 
			
		||||
| 
						 | 
				
			
			@ -484,16 +484,16 @@ class Item
 | 
			
		|||
	{
 | 
			
		||||
		// Look for any tags and linkify them
 | 
			
		||||
		$item['inform'] = '';
 | 
			
		||||
		$private_forum  = false;
 | 
			
		||||
		$private_group  = false;
 | 
			
		||||
		$private_id     = null;
 | 
			
		||||
		$only_to_forum  = false;
 | 
			
		||||
		$forum_contact  = [];
 | 
			
		||||
		$only_to_group  = false;
 | 
			
		||||
		$group_contact  = [];
 | 
			
		||||
		$receivers      = [];
 | 
			
		||||
 | 
			
		||||
		// Convert mentions in the body to a unified format
 | 
			
		||||
		$item['body'] = BBCode::setMentions($item['body'], $item['uid'], $item['network']);
 | 
			
		||||
 | 
			
		||||
		// Search for forum mentions
 | 
			
		||||
		// Search for group mentions
 | 
			
		||||
		foreach (Tag::getFromBody($item['body'], Tag::TAG_CHARACTER[Tag::MENTION] . Tag::TAG_CHARACTER[Tag::EXCLUSIVE_MENTION]) as $tag) {
 | 
			
		||||
			$contact = Contact::getByURLForUser($tag[2], $item['uid']);
 | 
			
		||||
			if (empty($contact)) {
 | 
			
		||||
| 
						 | 
				
			
			@ -512,37 +512,37 @@ class Item
 | 
			
		|||
			}
 | 
			
		||||
 | 
			
		||||
			if (!empty($contact['prv']) || ($tag[1] == Tag::TAG_CHARACTER[Tag::EXCLUSIVE_MENTION])) {
 | 
			
		||||
				$private_forum = $contact['prv'];
 | 
			
		||||
				$only_to_forum = ($tag[1] == Tag::TAG_CHARACTER[Tag::EXCLUSIVE_MENTION]);
 | 
			
		||||
				$private_group = $contact['prv'];
 | 
			
		||||
				$only_to_group = ($tag[1] == Tag::TAG_CHARACTER[Tag::EXCLUSIVE_MENTION]);
 | 
			
		||||
				$private_id = $contact['id'];
 | 
			
		||||
				$forum_contact = $contact;
 | 
			
		||||
				Logger::info('Private forum or exclusive mention', ['url' => $tag[2], 'mention' => $tag[1]]);
 | 
			
		||||
				$group_contact = $contact;
 | 
			
		||||
				Logger::info('Private group or exclusive mention', ['url' => $tag[2], 'mention' => $tag[1]]);
 | 
			
		||||
			} elseif ($item['allow_cid'] == '<' . $contact['id'] . '>') {
 | 
			
		||||
				$private_forum = false;
 | 
			
		||||
				$only_to_forum = true;
 | 
			
		||||
				$private_group = false;
 | 
			
		||||
				$only_to_group = true;
 | 
			
		||||
				$private_id = $contact['id'];
 | 
			
		||||
				$forum_contact = $contact;
 | 
			
		||||
				Logger::info('Public forum', ['url' => $tag[2], 'mention' => $tag[1]]);
 | 
			
		||||
				$group_contact = $contact;
 | 
			
		||||
				Logger::info('Public group', ['url' => $tag[2], 'mention' => $tag[1]]);
 | 
			
		||||
			} else {
 | 
			
		||||
				Logger::info('Post with forum mention will not be converted to a forum post', ['url' => $tag[2], 'mention' => $tag[1]]);
 | 
			
		||||
				Logger::info('Post with group mention will not be converted to a group post', ['url' => $tag[2], 'mention' => $tag[1]]);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		Logger::info('Got inform', ['inform' => $item['inform']]);
 | 
			
		||||
 | 
			
		||||
		if (($item['gravity'] == ItemModel::GRAVITY_PARENT) && !empty($forum_contact) && ($private_forum || $only_to_forum)) {
 | 
			
		||||
			// we tagged a forum in a top level post. Now we change the post
 | 
			
		||||
			$item['private'] = $private_forum ? ItemModel::PRIVATE : ItemModel::UNLISTED;
 | 
			
		||||
		if (($item['gravity'] == ItemModel::GRAVITY_PARENT) && !empty($group_contact) && ($private_group || $only_to_group)) {
 | 
			
		||||
			// we tagged a group in a top level post. Now we change the post
 | 
			
		||||
			$item['private'] = $private_group ? ItemModel::PRIVATE : ItemModel::UNLISTED;
 | 
			
		||||
 | 
			
		||||
			if ($only_to_forum) {
 | 
			
		||||
			if ($only_to_group) {
 | 
			
		||||
				$item['postopts'] = '';
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			$item['deny_cid'] = '';
 | 
			
		||||
			$item['deny_gid'] = '';
 | 
			
		||||
 | 
			
		||||
			if ($private_forum) {
 | 
			
		||||
			if ($private_group) {
 | 
			
		||||
				$item['allow_cid'] = '<' . $private_id . '>';
 | 
			
		||||
				$item['allow_gid'] = '<' . Circle::getIdForForum($forum_contact['id']) . '>';
 | 
			
		||||
				$item['allow_gid'] = '<' . Circle::getIdForGroup($group_contact['id']) . '>';
 | 
			
		||||
			} else {
 | 
			
		||||
				$item['allow_cid'] = '';
 | 
			
		||||
				$item['allow_gid'] = '';
 | 
			
		||||
| 
						 | 
				
			
			@ -1011,7 +1011,7 @@ class Item
 | 
			
		|||
		$post['body'] = $this->bbCodeVideo->transform($post['body']);
 | 
			
		||||
		$post = $this->setObjectType($post);
 | 
			
		||||
 | 
			
		||||
		// Personal notes must never be altered to a forum post.
 | 
			
		||||
		// Personal notes must never be altered to a group post.
 | 
			
		||||
		if ($post['post-type'] != ItemModel::PT_PERSONAL_NOTE) {
 | 
			
		||||
			// Look for any tags and linkify them
 | 
			
		||||
			$post = $this->expandTags($post);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -123,7 +123,7 @@ class Nav
 | 
			
		|||
			'$apps'         => $this->getAppMenu(),
 | 
			
		||||
			'$home'         => $this->l10n->t('Go back'),
 | 
			
		||||
			'$clear_notifs' => $this->l10n->t('Clear notifications'),
 | 
			
		||||
			'$search_hint'  => $this->l10n->t('@name, !forum, #tags, content')
 | 
			
		||||
			'$search_hint'  => $this->l10n->t('@name, !group, #tags, content')
 | 
			
		||||
		]);
 | 
			
		||||
 | 
			
		||||
		Hook::callAll('page_header', $nav);
 | 
			
		||||
| 
						 | 
				
			
			@ -273,7 +273,7 @@ class Nav
 | 
			
		|||
			];
 | 
			
		||||
 | 
			
		||||
			if ($this->config->get('system', 'poco_local_search')) {
 | 
			
		||||
				$nav['searchoption'][] = $this->l10n->t('Forums');
 | 
			
		||||
				$nav['searchoption'][] = $this->l10n->t('Groups');
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -861,7 +861,7 @@ class HTML
 | 
			
		|||
			'$id'           => $id,
 | 
			
		||||
			'$search_label' => DI::l10n()->t('Search'),
 | 
			
		||||
			'$save_label'   => $save_label,
 | 
			
		||||
			'$search_hint'  => DI::l10n()->t('@name, !forum, #tags, content'),
 | 
			
		||||
			'$search_hint'  => DI::l10n()->t('@name, !group, #tags, content'),
 | 
			
		||||
			'$mode'         => $mode,
 | 
			
		||||
			'$return_url'   => urlencode(Search::getSearchPath($s)),
 | 
			
		||||
		];
 | 
			
		||||
| 
						 | 
				
			
			@ -874,7 +874,7 @@ class HTML
 | 
			
		|||
			];
 | 
			
		||||
 | 
			
		||||
			if (DI::config()->get('system', 'poco_local_search')) {
 | 
			
		||||
				$values['$searchoption']['forums'] = DI::l10n()->t('Forums');
 | 
			
		||||
				$values['$searchoption']['groups'] = DI::l10n()->t('Groups');
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -530,7 +530,7 @@ class Widget
 | 
			
		|||
			['ref' => 'person', 'name' => DI::l10n()->t('Persons')],
 | 
			
		||||
			['ref' => 'organisation', 'name' => DI::l10n()->t('Organisations')],
 | 
			
		||||
			['ref' => 'news', 'name' => DI::l10n()->t('News')],
 | 
			
		||||
			['ref' => 'community', 'name' => DI::l10n()->t('Forums')],
 | 
			
		||||
			['ref' => 'community', 'name' => DI::l10n()->t('Groups')],
 | 
			
		||||
		];
 | 
			
		||||
 | 
			
		||||
		return self::filter('accounttype', DI::l10n()->t('Account Types'), '',
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -167,12 +167,12 @@ class ACL
 | 
			
		|||
 | 
			
		||||
		$acl_contacts[] = $acl_yourself;
 | 
			
		||||
 | 
			
		||||
		$acl_forums = Contact::selectToArray($fields,
 | 
			
		||||
		$acl_groups = Contact::selectToArray($fields,
 | 
			
		||||
			['uid' => $user_id, 'self' => false, 'blocked' => false, 'archive' => false, 'deleted' => false,
 | 
			
		||||
			'network' => Protocol::FEDERATED, 'pending' => false, 'contact-type' => Contact::TYPE_COMMUNITY], $params
 | 
			
		||||
		);
 | 
			
		||||
 | 
			
		||||
		$acl_contacts = array_merge($acl_forums, $acl_contacts);
 | 
			
		||||
		$acl_contacts = array_merge($acl_groups, $acl_contacts);
 | 
			
		||||
 | 
			
		||||
		array_walk($acl_contacts, function (&$value) {
 | 
			
		||||
			$value['type'] = 'contact';
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -42,7 +42,7 @@ class Search
 | 
			
		|||
	const DEFAULT_DIRECTORY = 'https://dir.friendica.social';
 | 
			
		||||
 | 
			
		||||
	const TYPE_PEOPLE = 0;
 | 
			
		||||
	const TYPE_FORUM  = 1;
 | 
			
		||||
	const TYPE_GROUP  = 1;
 | 
			
		||||
	const TYPE_ALL    = 2;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
| 
						 | 
				
			
			@ -55,7 +55,7 @@ class Search
 | 
			
		|||
	 * @throws HTTPException\InternalServerErrorException
 | 
			
		||||
	 * @throws \ImagickException
 | 
			
		||||
	 */
 | 
			
		||||
	public static function getContactsFromProbe(string $user, $only_forum = false): ResultList
 | 
			
		||||
	public static function getContactsFromProbe(string $user, $only_group = false): ResultList
 | 
			
		||||
	{
 | 
			
		||||
		$emptyResultList = new ResultList();
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -68,7 +68,7 @@ class Search
 | 
			
		|||
			return $emptyResultList;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if ($only_forum && ($user_data['contact-type'] != Contact::TYPE_COMMUNITY)) {
 | 
			
		||||
		if ($only_group && ($user_data['contact-type'] != Contact::TYPE_COMMUNITY)) {
 | 
			
		||||
			return $emptyResultList;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -112,8 +112,8 @@ class Search
 | 
			
		|||
		$searchUrl = $server . '/search';
 | 
			
		||||
 | 
			
		||||
		switch ($type) {
 | 
			
		||||
			case self::TYPE_FORUM:
 | 
			
		||||
				$searchUrl .= '/forum';
 | 
			
		||||
			case self::TYPE_GROUP:
 | 
			
		||||
				$searchUrl .= '/group';
 | 
			
		||||
				break;
 | 
			
		||||
			case self::TYPE_PEOPLE:
 | 
			
		||||
				$searchUrl .= '/people';
 | 
			
		||||
| 
						 | 
				
			
			@ -174,7 +174,7 @@ class Search
 | 
			
		|||
	{
 | 
			
		||||
		Logger::info('Searching', ['search' => $search, 'type' => $type, 'start' => $start, 'itempage' => $itemPage]);
 | 
			
		||||
 | 
			
		||||
		$contacts = Contact::searchByName($search, $type == self::TYPE_FORUM ? 'community' : '', true);
 | 
			
		||||
		$contacts = Contact::searchByName($search, $type == self::TYPE_GROUP ? 'community' : '', true);
 | 
			
		||||
 | 
			
		||||
		$resultList = new ResultList($start, count($contacts), $itemPage);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -240,7 +240,9 @@ class Search
 | 
			
		|||
					$return = array_map(function ($result) {
 | 
			
		||||
						static $contactType = [
 | 
			
		||||
							'People'       => Contact::TYPE_PERSON,
 | 
			
		||||
							// Kept for backward compatibility
 | 
			
		||||
							'Forum'        => Contact::TYPE_COMMUNITY,
 | 
			
		||||
							'Group'        => Contact::TYPE_COMMUNITY,
 | 
			
		||||
							'Organization' => Contact::TYPE_ORGANISATION,
 | 
			
		||||
							'News'         => Contact::TYPE_NEWS,
 | 
			
		||||
						];
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -615,9 +615,9 @@ class Circle
 | 
			
		|||
	 * @param integer $id Contact ID
 | 
			
		||||
	 * @return integer Circle ID
 | 
			
		||||
	 */
 | 
			
		||||
	public static function getIdForForum(int $id): int
 | 
			
		||||
	public static function getIdForGroup(int $id): int
 | 
			
		||||
	{
 | 
			
		||||
		Logger::info('Get id for forum id', ['id' => $id]);
 | 
			
		||||
		Logger::info('Get id for group id', ['id' => $id]);
 | 
			
		||||
		$contact = Contact::getById($id, ['uid', 'name', 'contact-type', 'manually-approve']);
 | 
			
		||||
		if (empty($contact) || ($contact['contact-type'] != Contact::TYPE_COMMUNITY) || !$contact['manually-approve']) {
 | 
			
		||||
			return 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -645,9 +645,9 @@ class Circle
 | 
			
		|||
	 * @param integer $id Contact ID
 | 
			
		||||
	 * @return void
 | 
			
		||||
	 */
 | 
			
		||||
	public static function updateMembersForForum(int $id)
 | 
			
		||||
	public static function updateMembersForGroup(int $id)
 | 
			
		||||
	{
 | 
			
		||||
		Logger::info('Update forum members', ['id' => $id]);
 | 
			
		||||
		Logger::info('Update group members', ['id' => $id]);
 | 
			
		||||
 | 
			
		||||
		$contact = Contact::getById($id, ['uid', 'url']);
 | 
			
		||||
		if (empty($contact)) {
 | 
			
		||||
| 
						 | 
				
			
			@ -659,7 +659,7 @@ class Circle
 | 
			
		|||
			return;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		$gid = self::getIdForForum($id);
 | 
			
		||||
		$gid = self::getIdForGroup($id);
 | 
			
		||||
		if (empty($gid)) {
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -682,6 +682,6 @@ class Circle
 | 
			
		|||
		}
 | 
			
		||||
 | 
			
		||||
		DBA::delete('group_member', ['gid' => $gid, 'contact-id' => $current]);
 | 
			
		||||
		Logger::info('Updated forum members', ['id' => $id, 'count' => DBA::count('group_member', ['gid' => $gid])]);
 | 
			
		||||
		Logger::info('Updated group members', ['id' => $id, 'count' => DBA::count('group_member', ['gid' => $gid])]);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -79,7 +79,7 @@ class Contact
 | 
			
		|||
	 * TYPE_NEWS - the account is a news reflector
 | 
			
		||||
	 *	Associated page type: PAGE_SOAPBOX
 | 
			
		||||
	 *
 | 
			
		||||
	 * TYPE_COMMUNITY - the account is community forum
 | 
			
		||||
	 * TYPE_COMMUNITY - the account is community group
 | 
			
		||||
	 *	Associated page types: PAGE_COMMUNITY, PAGE_PRVGROUP
 | 
			
		||||
	 *
 | 
			
		||||
	 * TYPE_RELAY - the account is a relay
 | 
			
		||||
| 
						 | 
				
			
			@ -1652,7 +1652,7 @@ class Contact
 | 
			
		|||
				break;
 | 
			
		||||
 | 
			
		||||
			case self::TYPE_COMMUNITY:
 | 
			
		||||
				$account_type = DI::l10n()->t("Forum");
 | 
			
		||||
				$account_type = DI::l10n()->t("Group");
 | 
			
		||||
				break;
 | 
			
		||||
 | 
			
		||||
			default:
 | 
			
		||||
| 
						 | 
				
			
			@ -3472,13 +3472,13 @@ class Contact
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Is the contact a forum?
 | 
			
		||||
	 * Is the contact a group?
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param integer $contactid ID of the contact
 | 
			
		||||
	 *
 | 
			
		||||
	 * @return boolean "true" if it is a forum
 | 
			
		||||
	 * @return boolean "true" if it is a group
 | 
			
		||||
	 */
 | 
			
		||||
	public static function isForum(int $contactid): bool
 | 
			
		||||
	public static function isGroup(int $contactid): bool
 | 
			
		||||
	{
 | 
			
		||||
		$fields = ['contact-type'];
 | 
			
		||||
		$condition = ['id' => $contactid];
 | 
			
		||||
| 
						 | 
				
			
			@ -3487,7 +3487,7 @@ class Contact
 | 
			
		|||
			return false;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Is it a forum?
 | 
			
		||||
		// Is it a group?
 | 
			
		||||
		return ($contact['contact-type'] == self::TYPE_COMMUNITY);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1004,7 +1004,7 @@ class Item
 | 
			
		|||
			$item['deleted']       = $toplevel_parent['deleted'];
 | 
			
		||||
			$item['wall']          = $toplevel_parent['wall'];
 | 
			
		||||
 | 
			
		||||
			// Reshares have to keep their permissions to allow forums to work
 | 
			
		||||
			// Reshares have to keep their permissions to allow groups to work
 | 
			
		||||
			if (!$defined_permissions && (!$item['origin'] || ($item['verb'] != Activity::ANNOUNCE))) {
 | 
			
		||||
				$item['allow_cid']     = $toplevel_parent['allow_cid'];
 | 
			
		||||
				$item['allow_gid']     = $toplevel_parent['allow_gid'];
 | 
			
		||||
| 
						 | 
				
			
			@ -1307,7 +1307,7 @@ class Item
 | 
			
		|||
 | 
			
		||||
		Post::update($fields, ['uri-id' => $posted_item['parent-uri-id'], 'uid' => $posted_item['uid']]);
 | 
			
		||||
 | 
			
		||||
		// In that function we check if this is a forum post. Additionally we delete the item under certain circumstances
 | 
			
		||||
		// In that function we check if this is a group post. Additionally we delete the item under certain circumstances
 | 
			
		||||
		if (self::tagDeliver($posted_item['uid'], $post_user_id)) {
 | 
			
		||||
			// Get the user information for the logging
 | 
			
		||||
			$user = User::getById($uid);
 | 
			
		||||
| 
						 | 
				
			
			@ -1418,11 +1418,11 @@ class Item
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Change the owner of a parent item if it had been shared by a forum
 | 
			
		||||
	 * Change the owner of a parent item if it had been shared by a group
 | 
			
		||||
	 *
 | 
			
		||||
	 * (public) forum posts in the new format consist of the regular post by the author
 | 
			
		||||
	 * followed by an announce message sent from the forum account.
 | 
			
		||||
	 * Changing the owner helps in grouping forum posts.
 | 
			
		||||
	 * (public) group posts in the new format consist of the regular post by the author
 | 
			
		||||
	 * followed by an announce message sent from the group account.
 | 
			
		||||
	 * Changing the owner helps in grouping group posts.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param array $item
 | 
			
		||||
	 * @return void
 | 
			
		||||
| 
						 | 
				
			
			@ -1458,7 +1458,7 @@ class Item
 | 
			
		|||
			}
 | 
			
		||||
 | 
			
		||||
			if (Contact::isSharing($parent['owner-id'], $item['uid'])) {
 | 
			
		||||
				Logger::info('The resharer is no forum: quit', ['resharer' => $item['author-id'], 'owner' => $parent['owner-id'], 'author' => $parent['author-id'], 'uid' => $item['uid']]);
 | 
			
		||||
				Logger::info('The resharer is no group: quit', ['resharer' => $item['author-id'], 'owner' => $parent['owner-id'], 'author' => $parent['author-id'], 'uid' => $item['uid']]);
 | 
			
		||||
				return;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -1603,7 +1603,7 @@ class Item
 | 
			
		|||
		if (($uid != 0) && ($item['gravity'] == self::GRAVITY_PARENT)) {
 | 
			
		||||
			$owner = User::getOwnerDataById($uid);
 | 
			
		||||
			if (($owner['contact-type'] == User::ACCOUNT_TYPE_COMMUNITY) && !Tag::isMentioned($uri_id, $owner['url'])) {
 | 
			
		||||
				Logger::info('Target user is a forum but is not mentioned here, thread will not be stored', ['uid' => $uid, 'uri-id' => $uri_id]);
 | 
			
		||||
				Logger::info('Target user is a group but is not mentioned here, thread will not be stored', ['uid' => $uid, 'uri-id' => $uri_id]);
 | 
			
		||||
				return 0;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -1709,7 +1709,7 @@ class Item
 | 
			
		|||
			return 0;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// When the post belongs to a a forum then all forum users are allowed to access it
 | 
			
		||||
		// When the post belongs to a a group then all group users are allowed to access it
 | 
			
		||||
		foreach (Tag::getByURIId($uriid, [Tag::MENTION, Tag::EXCLUSIVE_MENTION]) as $tag) {
 | 
			
		||||
			if (DBA::exists('contact', ['uid' => $uid, 'nurl' => Strings::normaliseLink($tag['url']), 'contact-type' => Contact::TYPE_COMMUNITY])) {
 | 
			
		||||
				$target_uid = User::getIdForURL($tag['url']);
 | 
			
		||||
| 
						 | 
				
			
			@ -2104,7 +2104,7 @@ class Item
 | 
			
		|||
		/// @todo On private posts we could obfuscate the date
 | 
			
		||||
		$update = ($arr['private'] != self::PRIVATE) || in_array($arr['network'], Protocol::FEDERATED);
 | 
			
		||||
 | 
			
		||||
		// Is it a forum? Then we don't care about the rules from above
 | 
			
		||||
		// Is it a group? Then we don't care about the rules from above
 | 
			
		||||
		if (!$update && in_array($arr["network"], [Protocol::ACTIVITYPUB, Protocol::DFRN]) && ($arr["parent-uri-id"] === $arr["uri-id"])) {
 | 
			
		||||
			if (DBA::exists('contact', ['id' => $arr['contact-id'], 'forum' => true])) {
 | 
			
		||||
				$update = true;
 | 
			
		||||
| 
						 | 
				
			
			@ -2200,7 +2200,7 @@ class Item
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * look for mention tags and setup a second delivery chain for forum/community posts if appropriate
 | 
			
		||||
	 * look for mention tags and setup a second delivery chain for group/community posts if appropriate
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param int $uid
 | 
			
		||||
	 * @param int $item_id
 | 
			
		||||
| 
						 | 
				
			
			@ -3663,13 +3663,13 @@ class Item
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Does the given uri-id belongs to a post that is sent as starting post to a forum?
 | 
			
		||||
	 * Does the given uri-id belongs to a post that is sent as starting post to a group?
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param int $uri_id
 | 
			
		||||
	 *
 | 
			
		||||
	 * @return boolean "true" when it is a forum post
 | 
			
		||||
	 * @return boolean "true" when it is a group post
 | 
			
		||||
	 */
 | 
			
		||||
	public static function isForumPost(int $uri_id): bool
 | 
			
		||||
	public static function isGroupPost(int $uri_id): bool
 | 
			
		||||
	{
 | 
			
		||||
		foreach (Tag::getByURIId($uri_id, [Tag::EXCLUSIVE_MENTION]) as $tag) {
 | 
			
		||||
			if (DBA::exists('contact', ['uid' => 0, 'nurl' => Strings::normaliseLink($tag['url']), 'contact-type' => Contact::TYPE_COMMUNITY])) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -42,7 +42,7 @@ class Type
 | 
			
		|||
	const TAG_SELF = 128;
 | 
			
		||||
	/** @var int Notification about getting poked/prodded/etc. (Obsolete) */
 | 
			
		||||
	const POKE = 512;
 | 
			
		||||
	/** @var int Notification about either a contact had posted something directly or the contact is a mentioned forum */
 | 
			
		||||
	/** @var int Notification about either a contact had posted something directly or the contact is a mentioned group */
 | 
			
		||||
	const SHARE = 1024;
 | 
			
		||||
 | 
			
		||||
	/** @var int Global System notifications */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -830,7 +830,7 @@ class Photo
 | 
			
		|||
	 * Changes photo permissions that had been embedded in a post
 | 
			
		||||
	 *
 | 
			
		||||
	 * @todo This function currently does have some flaws:
 | 
			
		||||
	 * - Sharing a post with a forum will create a photo that only the forum can see.
 | 
			
		||||
	 * - Sharing a post with a group will create a photo that only the group can see.
 | 
			
		||||
	 * - Sharing a photo again that been shared non public before doesn't alter the permissions.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @return string
 | 
			
		||||
| 
						 | 
				
			
			@ -877,7 +877,7 @@ class Photo
 | 
			
		|||
			/**
 | 
			
		||||
			 * @todo Existing permissions need to be mixed with the new ones.
 | 
			
		||||
			 * Otherwise this creates problems with sharing the same picture multiple times
 | 
			
		||||
			 * Also check if $str_contact_allow does contain a public forum.
 | 
			
		||||
			 * Also check if $str_contact_allow does contain a public group.
 | 
			
		||||
			 * Then set the permissions to public.
 | 
			
		||||
			 */
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -50,7 +50,7 @@ class Tag
 | 
			
		|||
	 */
 | 
			
		||||
	const IMPLICIT_MENTION  = 8;
 | 
			
		||||
	/**
 | 
			
		||||
	 * An exclusive mention transmits the post only to the target account without transmitting it to the followers, usually a forum.
 | 
			
		||||
	 * An exclusive mention transmits the post only to the target account without transmitting it to the followers, usually a group.
 | 
			
		||||
	 */
 | 
			
		||||
	const EXCLUSIVE_MENTION = 9;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -88,7 +88,7 @@ class User
 | 
			
		|||
	 * ACCOUNT_TYPE_NEWS - the account is a news reflector
 | 
			
		||||
	 *	Associated page type: PAGE_FLAGS_SOAPBOX
 | 
			
		||||
	 *
 | 
			
		||||
	 * ACCOUNT_TYPE_COMMUNITY - the account is community forum
 | 
			
		||||
	 * ACCOUNT_TYPE_COMMUNITY - the account is community group
 | 
			
		||||
	 *	Associated page types: PAGE_COMMUNITY, PAGE_FLAGS_PRVGROUP
 | 
			
		||||
	 *
 | 
			
		||||
	 * ACCOUNT_TYPE_RELAY - the account is a relay
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -71,8 +71,8 @@ class BaseSearch extends BaseModule
 | 
			
		|||
			$header  = DI::l10n()->t('People Search - %s', $search);
 | 
			
		||||
		} elseif (strpos($search, '!') === 0) {
 | 
			
		||||
			$search = trim(substr($search, 1));
 | 
			
		||||
			$type   = Search::TYPE_FORUM;
 | 
			
		||||
			$header = DI::l10n()->t('Forum Search - %s', $search);
 | 
			
		||||
			$type   = Search::TYPE_GROUP;
 | 
			
		||||
			$header = DI::l10n()->t('Group Search - %s', $search);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		$search = Network::convertToIdn($search);
 | 
			
		||||
| 
						 | 
				
			
			@ -98,7 +98,7 @@ class BaseSearch extends BaseModule
 | 
			
		|||
		}
 | 
			
		||||
 | 
			
		||||
		if (!$results->getTotal()) {
 | 
			
		||||
			$results = Search::getContactsFromProbe(Network::convertToIdn($search), $type == Search::TYPE_FORUM);
 | 
			
		||||
			$results = Search::getContactsFromProbe(Network::convertToIdn($search), $type == Search::TYPE_GROUP);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return self::printResult($results, $pager, $header);
 | 
			
		||||
| 
						 | 
				
			
			@ -151,4 +151,4 @@ class BaseSearch extends BaseModule
 | 
			
		|||
			'$paginate' => $pager->renderFull($results->getTotal()),
 | 
			
		||||
		]);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -24,7 +24,7 @@ namespace Friendica\Module\Conversation;
 | 
			
		|||
use Friendica\BaseModule;
 | 
			
		||||
use Friendica\Content\BoundariesPager;
 | 
			
		||||
use Friendica\Content\Conversation;
 | 
			
		||||
use Friendica\Content\ForumManager;
 | 
			
		||||
use Friendica\Content\GroupManager;
 | 
			
		||||
use Friendica\Content\Nav;
 | 
			
		||||
use Friendica\Content\Widget;
 | 
			
		||||
use Friendica\Content\Text\HTML;
 | 
			
		||||
| 
						 | 
				
			
			@ -52,7 +52,7 @@ class Network extends BaseModule
 | 
			
		|||
	/** @var int */
 | 
			
		||||
	private static $circleId;
 | 
			
		||||
	/** @var int */
 | 
			
		||||
	private static $forumContactId;
 | 
			
		||||
	private static $groupContactId;
 | 
			
		||||
	/** @var string */
 | 
			
		||||
	private static $selectedTab;
 | 
			
		||||
	/** @var mixed */
 | 
			
		||||
| 
						 | 
				
			
			@ -90,9 +90,9 @@ class Network extends BaseModule
 | 
			
		|||
 | 
			
		||||
		DI::page()['aside'] .= Widget::accountTypes($module, self::$accountTypeString);
 | 
			
		||||
		DI::page()['aside'] .= Circle::sidebarWidget($module, $module . '/circle', 'standard', self::$circleId);
 | 
			
		||||
		DI::page()['aside'] .= ForumManager::widget($module . '/forum', DI::userSession()->getLocalUserId(), self::$forumContactId);
 | 
			
		||||
		DI::page()['aside'] .= GroupManager::widget($module . '/group', DI::userSession()->getLocalUserId(), self::$groupContactId);
 | 
			
		||||
		DI::page()['aside'] .= Widget::postedByYear($module . '/archive', DI::userSession()->getLocalUserId(), false);
 | 
			
		||||
		DI::page()['aside'] .= Widget::networks($module, !self::$forumContactId ? self::$network : '');
 | 
			
		||||
		DI::page()['aside'] .= Widget::networks($module, !self::$groupContactId ? self::$network : '');
 | 
			
		||||
		DI::page()['aside'] .= Widget\SavedSearches::getHTML(DI::args()->getQueryString());
 | 
			
		||||
		DI::page()['aside'] .= Widget::fileAs('filed', '');
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -119,9 +119,9 @@ class Network extends BaseModule
 | 
			
		|||
 | 
			
		||||
			$content = '';
 | 
			
		||||
 | 
			
		||||
			if (self::$forumContactId) {
 | 
			
		||||
				// If self::$forumContactId belongs to a community forum or a private group, add a mention to the status editor
 | 
			
		||||
				$condition = ["`id` = ? AND `contact-type` = ?", self::$forumContactId, Contact::TYPE_COMMUNITY];
 | 
			
		||||
			if (self::$groupContactId) {
 | 
			
		||||
				// If self::$groupContactId belongs to a community group or a private group, add a mention to the status editor
 | 
			
		||||
				$condition = ["`id` = ? AND `contact-type` = ?", self::$groupContactId, Contact::TYPE_COMMUNITY];
 | 
			
		||||
				$contact = DBA::selectFirst('contact', ['addr'], $condition);
 | 
			
		||||
				if (!empty($contact['addr'])) {
 | 
			
		||||
					$content = '!' . $contact['addr'];
 | 
			
		||||
| 
						 | 
				
			
			@ -136,8 +136,8 @@ class Network extends BaseModule
 | 
			
		|||
			}
 | 
			
		||||
 | 
			
		||||
			$allowedCids = [];
 | 
			
		||||
			if (self::$forumContactId) {
 | 
			
		||||
				$allowedCids[] = (int) self::$forumContactId;
 | 
			
		||||
			if (self::$groupContactId) {
 | 
			
		||||
				$allowedCids[] = (int) self::$groupContactId;
 | 
			
		||||
			} elseif (self::$network) {
 | 
			
		||||
				$condition = [
 | 
			
		||||
					'uid'     => DI::userSession()->getLocalUserId(),
 | 
			
		||||
| 
						 | 
				
			
			@ -160,9 +160,9 @@ class Network extends BaseModule
 | 
			
		|||
			}
 | 
			
		||||
 | 
			
		||||
			$x = [
 | 
			
		||||
				'lockstate' => self::$circleId || self::$forumContactId || self::$network || ACL::getLockstateForUserId($a->getLoggedInUserId()) ? 'lock' : 'unlock',
 | 
			
		||||
				'lockstate' => self::$circleId || self::$groupContactId || self::$network || ACL::getLockstateForUserId($a->getLoggedInUserId()) ? 'lock' : 'unlock',
 | 
			
		||||
				'acl' => ACL::getFullSelectorHTML(DI::page(), $a->getLoggedInUserId(), true, $default_permissions),
 | 
			
		||||
				'bang' => ((self::$circleId || self::$forumContactId || self::$network) ? '!' : ''),
 | 
			
		||||
				'bang' => ((self::$circleId || self::$groupContactId || self::$network) ? '!' : ''),
 | 
			
		||||
				'content' => $content,
 | 
			
		||||
			];
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -178,8 +178,8 @@ class Network extends BaseModule
 | 
			
		|||
			$o = Renderer::replaceMacros(Renderer::getMarkupTemplate('section_title.tpl'), [
 | 
			
		||||
				'$title' => DI::l10n()->t('Circle: %s', $circle['name'])
 | 
			
		||||
			]) . $o;
 | 
			
		||||
		} elseif (self::$forumContactId) {
 | 
			
		||||
			$contact = Contact::getById(self::$forumContactId);
 | 
			
		||||
		} elseif (self::$groupContactId) {
 | 
			
		||||
			$contact = Contact::getById(self::$groupContactId);
 | 
			
		||||
			if (DBA::isResult($contact)) {
 | 
			
		||||
				$o = Renderer::replaceMacros(Renderer::getMarkupTemplate('contact/list.tpl'), [
 | 
			
		||||
					'contacts' => [ModuleContact::getContactTemplateVars($contact)],
 | 
			
		||||
| 
						 | 
				
			
			@ -307,7 +307,7 @@ class Network extends BaseModule
 | 
			
		|||
	{
 | 
			
		||||
		self::$circleId = $this->parameters['circle_id'] ?? 0;
 | 
			
		||||
 | 
			
		||||
		self::$forumContactId = $this->parameters['contact_id'] ?? 0;
 | 
			
		||||
		self::$groupContactId = $this->parameters['contact_id'] ?? 0;
 | 
			
		||||
 | 
			
		||||
		self::$selectedTab = self::getTimelineOrderBySession(DI::userSession(), DI::pConfig());
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -413,10 +413,10 @@ class Network extends BaseModule
 | 
			
		|||
 | 
			
		||||
		if (self::$circleId) {
 | 
			
		||||
			$conditionStrings = DBA::mergeConditions($conditionStrings, ["`contact-id` IN (SELECT `contact-id` FROM `group_member` WHERE `gid` = ?)", self::$circleId]);
 | 
			
		||||
		} elseif (self::$forumContactId) {
 | 
			
		||||
		} elseif (self::$groupContactId) {
 | 
			
		||||
			$conditionStrings = DBA::mergeConditions($conditionStrings,
 | 
			
		||||
				["((`contact-id` = ?) OR `uri-id` IN (SELECT `parent-uri-id` FROM `post-user-view` WHERE (`contact-id` = ? AND `gravity` = ? AND `vid` = ? AND `uid` = ?)))",
 | 
			
		||||
				self::$forumContactId, self::$forumContactId, Item::GRAVITY_ACTIVITY, Verb::getID(Activity::ANNOUNCE), DI::userSession()->getLocalUserId()]);
 | 
			
		||||
				self::$groupContactId, self::$groupContactId, Item::GRAVITY_ACTIVITY, Verb::getID(Activity::ANNOUNCE), DI::userSession()->getLocalUserId()]);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Currently only the order modes "received" and "commented" are in use
 | 
			
		||||
| 
						 | 
				
			
			@ -479,7 +479,7 @@ class Network extends BaseModule
 | 
			
		|||
		// We aren't going to try and figure out at the item, circle, and page
 | 
			
		||||
		// level which items you've seen and which you haven't. If you're looking
 | 
			
		||||
		// at the top level network page just mark everything seen.
 | 
			
		||||
		if (!self::$circleId && !self::$forumContactId && !self::$star && !self::$mention) {
 | 
			
		||||
		if (!self::$circleId && !self::$groupContactId && !self::$star && !self::$mention) {
 | 
			
		||||
			$condition = ['unseen' => true, 'uid' => DI::userSession()->getLocalUserId()];
 | 
			
		||||
			self::setItemsSeenByCondition($condition);
 | 
			
		||||
		} elseif (!empty($parents)) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -118,15 +118,15 @@ abstract class BaseUsers extends BaseModeration
 | 
			
		|||
			$page_types = [
 | 
			
		||||
				User::PAGE_FLAGS_NORMAL    => $this->t('Normal Account Page'),
 | 
			
		||||
				User::PAGE_FLAGS_SOAPBOX   => $this->t('Soapbox Page'),
 | 
			
		||||
				User::PAGE_FLAGS_COMMUNITY => $this->t('Public Forum'),
 | 
			
		||||
				User::PAGE_FLAGS_COMMUNITY => $this->t('Public Group'),
 | 
			
		||||
				User::PAGE_FLAGS_FREELOVE  => $this->t('Automatic Friend Page'),
 | 
			
		||||
				User::PAGE_FLAGS_PRVGROUP  => $this->t('Private Forum')
 | 
			
		||||
				User::PAGE_FLAGS_PRVGROUP  => $this->t('Private Group')
 | 
			
		||||
			];
 | 
			
		||||
			$account_types = [
 | 
			
		||||
				User::ACCOUNT_TYPE_PERSON       => $this->t('Personal Page'),
 | 
			
		||||
				User::ACCOUNT_TYPE_ORGANISATION => $this->t('Organisation Page'),
 | 
			
		||||
				User::ACCOUNT_TYPE_NEWS         => $this->t('News Page'),
 | 
			
		||||
				User::ACCOUNT_TYPE_COMMUNITY    => $this->t('Community Forum'),
 | 
			
		||||
				User::ACCOUNT_TYPE_COMMUNITY    => $this->t('Community Group'),
 | 
			
		||||
				User::ACCOUNT_TYPE_RELAY        => $this->t('Relay'),
 | 
			
		||||
			];
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -52,10 +52,10 @@ class Summary extends BaseModeration
 | 
			
		|||
		$accounts = [
 | 
			
		||||
			[$this->t('Normal Account'), 0],
 | 
			
		||||
			[$this->t('Automatic Follower Account'), 0],
 | 
			
		||||
			[$this->t('Public Forum Account'), 0],
 | 
			
		||||
			[$this->t('Public Group Account'), 0],
 | 
			
		||||
			[$this->t('Automatic Friend Account'), 0],
 | 
			
		||||
			[$this->t('Blog Account'), 0],
 | 
			
		||||
			[$this->t('Private Forum Account'), 0]
 | 
			
		||||
			[$this->t('Private Group Account'), 0]
 | 
			
		||||
		];
 | 
			
		||||
 | 
			
		||||
		$users = 0;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -24,7 +24,7 @@ namespace Friendica\Module\Notifications;
 | 
			
		|||
use Friendica\App;
 | 
			
		||||
use Friendica\BaseModule;
 | 
			
		||||
use Friendica\Contact\Introduction\Repository\Introduction;
 | 
			
		||||
use Friendica\Content\ForumManager;
 | 
			
		||||
use Friendica\Content\GroupManager;
 | 
			
		||||
use Friendica\Core\Cache\Capability\ICanCache;
 | 
			
		||||
use Friendica\Core\Cache\Enum\Duration;
 | 
			
		||||
use Friendica\Core\Config\Capability\IManageConfigValues;
 | 
			
		||||
| 
						 | 
				
			
			@ -109,14 +109,14 @@ class Ping extends BaseModule
 | 
			
		|||
		$register_count  = 0;
 | 
			
		||||
		$sysnotify_count = 0;
 | 
			
		||||
		$circles_unseen   = [];
 | 
			
		||||
		$forums_unseen   = [];
 | 
			
		||||
		$groups_unseen   = [];
 | 
			
		||||
 | 
			
		||||
		$event_count          = 0;
 | 
			
		||||
		$today_event_count    = 0;
 | 
			
		||||
		$birthday_count       = 0;
 | 
			
		||||
		$today_birthday_count = 0;
 | 
			
		||||
 | 
			
		||||
		// Suppress notification display for forum accounts
 | 
			
		||||
		// Suppress notification display for group accounts
 | 
			
		||||
		if ($this->session->getLocalUserId() && $this->session->get('page_flags', '') != User::PAGE_FLAGS_COMMUNITY) {
 | 
			
		||||
			if ($this->pconfig->get($this->session->getLocalUserId(), 'system', 'detailed_notif')) {
 | 
			
		||||
				$notifications = $this->notificationRepo->selectDetailedForUser($this->session->getLocalUserId());
 | 
			
		||||
| 
						 | 
				
			
			@ -160,9 +160,9 @@ class Ping extends BaseModule
 | 
			
		|||
					}
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				foreach (ForumManager::countUnseenItems() as $forum_count) {
 | 
			
		||||
					if ($forum_count['count'] > 0) {
 | 
			
		||||
						$forums_unseen[] = $forum_count;
 | 
			
		||||
				foreach (GroupManager::countUnseenItems() as $group_count) {
 | 
			
		||||
					if ($group_count['count'] > 0) {
 | 
			
		||||
						$groups_unseen[] = $group_count;
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
| 
						 | 
				
			
			@ -290,7 +290,7 @@ class Ping extends BaseModule
 | 
			
		|||
		$data['birthdays']       = $birthday_count;
 | 
			
		||||
		$data['birthdays-today'] = $today_birthday_count;
 | 
			
		||||
		$data['circles']         = $circles_unseen;
 | 
			
		||||
		$data['forums']          = $forums_unseen;
 | 
			
		||||
		$data['groups']          = $groups_unseen;
 | 
			
		||||
		$data['notification']    = ($notification_count < 50) ? $notification_count : '49+';
 | 
			
		||||
 | 
			
		||||
		$data['notifications'] = $navNotifications;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -188,7 +188,7 @@ class Conversations extends BaseProfile
 | 
			
		|||
			$condition = DBA::mergeConditions($condition, ["`received` >= ?", DateTimeFormat::convert($datequery2, 'UTC', $this->app->getTimeZone())]);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Does the profile page belong to a forum?
 | 
			
		||||
		// Does the profile page belong to a group?
 | 
			
		||||
		// If not then we can improve the performance with an additional condition
 | 
			
		||||
		if ($profile['account-type'] != User::ACCOUNT_TYPE_COMMUNITY) {
 | 
			
		||||
			$condition = DBA::mergeConditions($condition, ['contact-id' => $profile['id']]);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -23,7 +23,7 @@ namespace Friendica\Module\Profile;
 | 
			
		|||
 | 
			
		||||
use Friendica\App;
 | 
			
		||||
use Friendica\Content\Feature;
 | 
			
		||||
use Friendica\Content\ForumManager;
 | 
			
		||||
use Friendica\Content\GroupManager;
 | 
			
		||||
use Friendica\Content\Nav;
 | 
			
		||||
use Friendica\Content\Text\BBCode;
 | 
			
		||||
use Friendica\Core\Config\Capability\IManageConfigValues;
 | 
			
		||||
| 
						 | 
				
			
			@ -254,12 +254,12 @@ class Profile extends BaseProfile
 | 
			
		|||
			);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		//show subscribed forum if it is enabled in the usersettings
 | 
			
		||||
		//show subscribed group if it is enabled in the usersettings
 | 
			
		||||
		if (Feature::isEnabled($profile['uid'], 'forumlist_profile')) {
 | 
			
		||||
			$custom_fields += self::buildField(
 | 
			
		||||
				'forumlist',
 | 
			
		||||
				$this->t('Forums:'),
 | 
			
		||||
				ForumManager::profileAdvanced($profile['uid'])
 | 
			
		||||
				'group_list',
 | 
			
		||||
				$this->t('Groups:'),
 | 
			
		||||
				GroupManager::profileAdvanced($profile['uid'])
 | 
			
		||||
			);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -50,7 +50,7 @@ class Acl extends BaseModule
 | 
			
		|||
	const TYPE_MENTION_CONTACT        = 'c';
 | 
			
		||||
	const TYPE_MENTION_CIRCLE         = 'g';
 | 
			
		||||
	const TYPE_MENTION_CONTACT_CIRCLE = '';
 | 
			
		||||
	const TYPE_MENTION_FORUM          = 'f';
 | 
			
		||||
	const TYPE_MENTION_GROUP          = 'f';
 | 
			
		||||
	const TYPE_PRIVATE_MESSAGE        = 'm';
 | 
			
		||||
	const TYPE_ANY_CONTACT            = 'a';
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -100,7 +100,7 @@ class Acl extends BaseModule
 | 
			
		|||
				'nick'    => $contact['addr'] ?: $contact['url'],
 | 
			
		||||
				'network' => $contact['network'],
 | 
			
		||||
				'link'    => $contact['url'],
 | 
			
		||||
				'forum'   => $contact['contact-type'] == Contact::TYPE_COMMUNITY,
 | 
			
		||||
				'group'   => $contact['contact-type'] == Contact::TYPE_COMMUNITY,
 | 
			
		||||
			];
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -161,7 +161,7 @@ class Acl extends BaseModule
 | 
			
		|||
					]);
 | 
			
		||||
				break;
 | 
			
		||||
 | 
			
		||||
			case self::TYPE_MENTION_FORUM:
 | 
			
		||||
			case self::TYPE_MENTION_GROUP:
 | 
			
		||||
				$condition = DBA::mergeConditions($condition,
 | 
			
		||||
					["NOT `self` AND NOT `blocked` AND `notify` != ? AND `contact-type` = ?", '', Contact::TYPE_COMMUNITY
 | 
			
		||||
					]);
 | 
			
		||||
| 
						 | 
				
			
			@ -205,7 +205,7 @@ class Acl extends BaseModule
 | 
			
		|||
					'id'    => intval($circle['id']),
 | 
			
		||||
					'uids'  => array_map('intval', explode(',', $circle['uids'])),
 | 
			
		||||
					'link'  => '',
 | 
			
		||||
					'forum' => '0'
 | 
			
		||||
					'group' => '0'
 | 
			
		||||
				];
 | 
			
		||||
			}
 | 
			
		||||
			if ((count($resultCircles) > 0) && ($search == '')) {
 | 
			
		||||
| 
						 | 
				
			
			@ -218,7 +218,7 @@ class Acl extends BaseModule
 | 
			
		|||
			$contacts = Contact::selectToArray([], $condition, ['order' => ['name']]);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		$forums = [];
 | 
			
		||||
		$groups = [];
 | 
			
		||||
		foreach ($contacts as $contact) {
 | 
			
		||||
			$entry = [
 | 
			
		||||
				'type'    => self::TYPE_MENTION_CONTACT,
 | 
			
		||||
| 
						 | 
				
			
			@ -229,21 +229,21 @@ class Acl extends BaseModule
 | 
			
		|||
				'link'    => $contact['url'],
 | 
			
		||||
				'nick'    => htmlentities(($contact['attag'] ?? '') ?: $contact['nick']),
 | 
			
		||||
				'addr'    => htmlentities(($contact['addr'] ?? '') ?: $contact['url']),
 | 
			
		||||
				'forum'   => $contact['contact-type'] == Contact::TYPE_COMMUNITY,
 | 
			
		||||
				'group'   => $contact['contact-type'] == Contact::TYPE_COMMUNITY,
 | 
			
		||||
			];
 | 
			
		||||
			if ($entry['forum']) {
 | 
			
		||||
				$forums[] = $entry;
 | 
			
		||||
			if ($entry['group']) {
 | 
			
		||||
				$groups[] = $entry;
 | 
			
		||||
			} else {
 | 
			
		||||
				$resultContacts[] = $entry;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if ($forums) {
 | 
			
		||||
		if ($groups) {
 | 
			
		||||
			if ($search == '') {
 | 
			
		||||
				$forums[] = ['separator' => true];
 | 
			
		||||
				$groups[] = ['separator' => true];
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			$resultContacts = array_merge($forums, $resultContacts);
 | 
			
		||||
			$resultContacts = array_merge($groups, $resultContacts);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		$resultItems = array_merge($resultCircles, $resultContacts);
 | 
			
		||||
| 
						 | 
				
			
			@ -285,7 +285,7 @@ class Acl extends BaseModule
 | 
			
		|||
						'link'    => $contact['url'],
 | 
			
		||||
						'nick'    => htmlentities(($contact['nick'] ?? '') ?: $contact['addr']),
 | 
			
		||||
						'addr'    => htmlentities(($contact['addr'] ?? '') ?: $contact['url']),
 | 
			
		||||
						'forum'   => $contact['forum']
 | 
			
		||||
						'group'   => $contact['forum']
 | 
			
		||||
					];
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -139,7 +139,7 @@ class Index extends BaseSearch
 | 
			
		|||
						break;
 | 
			
		||||
					case 'contacts':
 | 
			
		||||
						return self::performContactSearch($search, '@');
 | 
			
		||||
					case 'forums':
 | 
			
		||||
					case 'groups':
 | 
			
		||||
						return self::performContactSearch($search, '!');
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -452,7 +452,7 @@ class Account extends BaseSettings
 | 
			
		|||
		$pagetype    = Renderer::replaceMacros($pageset_tpl, [
 | 
			
		||||
			'$account_types'     => DI::l10n()->t("Account Types"),
 | 
			
		||||
			'$user'              => DI::l10n()->t("Personal Page Subtypes"),
 | 
			
		||||
			'$community'         => DI::l10n()->t("Community Forum Subtypes"),
 | 
			
		||||
			'$community'         => DI::l10n()->t("Community Group Subtypes"),
 | 
			
		||||
			'$account_type'      => $user['account-type'],
 | 
			
		||||
			'$type_person'       => User::ACCOUNT_TYPE_PERSON,
 | 
			
		||||
			'$type_organisation' => User::ACCOUNT_TYPE_ORGANISATION,
 | 
			
		||||
| 
						 | 
				
			
			@ -481,7 +481,7 @@ class Account extends BaseSettings
 | 
			
		|||
			],
 | 
			
		||||
			'$account_community' => [
 | 
			
		||||
				'account-type',
 | 
			
		||||
				DI::l10n()->t('Community Forum'),
 | 
			
		||||
				DI::l10n()->t('Community Group'),
 | 
			
		||||
				User::ACCOUNT_TYPE_COMMUNITY,
 | 
			
		||||
				DI::l10n()->t('Account for community discussions.'),
 | 
			
		||||
				$user['account-type'] == User::ACCOUNT_TYPE_COMMUNITY
 | 
			
		||||
| 
						 | 
				
			
			@ -502,7 +502,7 @@ class Account extends BaseSettings
 | 
			
		|||
			],
 | 
			
		||||
			'$page_community' => [
 | 
			
		||||
				'page-flags',
 | 
			
		||||
				DI::l10n()->t('Public Forum'),
 | 
			
		||||
				DI::l10n()->t('Public Group'),
 | 
			
		||||
				User::PAGE_FLAGS_COMMUNITY,
 | 
			
		||||
				DI::l10n()->t('Automatically approves all contact requests.'),
 | 
			
		||||
				$user['page-flags'] == User::PAGE_FLAGS_COMMUNITY
 | 
			
		||||
| 
						 | 
				
			
			@ -516,7 +516,7 @@ class Account extends BaseSettings
 | 
			
		|||
			],
 | 
			
		||||
			'$page_prvgroup' => [
 | 
			
		||||
				'page-flags',
 | 
			
		||||
				DI::l10n()->t('Private Forum [Experimental]'),
 | 
			
		||||
				DI::l10n()->t('Private Group [Experimental]'),
 | 
			
		||||
				User::PAGE_FLAGS_PRVGROUP,
 | 
			
		||||
				DI::l10n()->t('Requires manual approval of contact requests.'),
 | 
			
		||||
				$user['page-flags'] == User::PAGE_FLAGS_PRVGROUP
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -242,7 +242,7 @@ class Notify extends BaseRepository
 | 
			
		|||
			return false;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// There is no need to create notifications for forum accounts
 | 
			
		||||
		// There is no need to create notifications for group accounts
 | 
			
		||||
		if ($user['account-type'] == Model\User::ACCOUNT_TYPE_COMMUNITY) {
 | 
			
		||||
			return false;
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -925,7 +925,7 @@ class Post
 | 
			
		|||
 | 
			
		||||
		if ($conv) {
 | 
			
		||||
			// This will allow us to comment on wall-to-wall items owned by our friends
 | 
			
		||||
			// and community forums even if somebody else wrote the post.
 | 
			
		||||
			// and community groups even if somebody else wrote the post.
 | 
			
		||||
			// bug #517 - this fixes for conversation owner
 | 
			
		||||
			if ($conv->getMode() == 'profile' && $conv->getProfileOwner() == DI::userSession()->getLocalUserId()) {
 | 
			
		||||
				return true;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -52,8 +52,8 @@ use Friendica\Util\JsonLD;
 | 
			
		|||
 * - Polling the outboxes for missing content?
 | 
			
		||||
 *
 | 
			
		||||
 * Missing parts from DFRN:
 | 
			
		||||
 * - Public Forum
 | 
			
		||||
 * - Private Forum
 | 
			
		||||
 * - Public Group
 | 
			
		||||
 * - Private Group
 | 
			
		||||
 * - Relocation
 | 
			
		||||
 */
 | 
			
		||||
class ActivityPub
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -415,7 +415,7 @@ class Processor
 | 
			
		|||
			$item['post-type'] = Item::PT_NOTE;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		$item['isForum'] = false;
 | 
			
		||||
		$item['isGroup'] = false;
 | 
			
		||||
 | 
			
		||||
		if (!empty($activity['thread-completion'])) {
 | 
			
		||||
			if ($activity['thread-completion'] != $item['owner-id']) {
 | 
			
		||||
| 
						 | 
				
			
			@ -434,7 +434,7 @@ class Processor
 | 
			
		|||
			$item['owner-id'] = $item['author-id'];
 | 
			
		||||
		} else {
 | 
			
		||||
			$actor = APContact::getByURL($item['owner-link'], false);
 | 
			
		||||
			$item['isForum'] = ($actor['type'] ?? 'Person') == 'Group';
 | 
			
		||||
			$item['isGroup'] = ($actor['type'] ?? 'Person') == 'Group';
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		$item['uri'] = $activity['id'];
 | 
			
		||||
| 
						 | 
				
			
			@ -1059,7 +1059,7 @@ class Processor
 | 
			
		|||
				$item['causer-id'] = ($item['gravity'] == Item::GRAVITY_PARENT) ? $item['owner-id'] : $item['author-id'];
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if ($item['isForum'] ?? false) {
 | 
			
		||||
			if ($item['isGroup'] ?? false) {
 | 
			
		||||
				$item['contact-id'] = Contact::getIdForURL($activity['actor'], $receiver);
 | 
			
		||||
			} else {
 | 
			
		||||
				$item['contact-id'] = Contact::getIdForURL($activity['author'], $receiver);
 | 
			
		||||
| 
						 | 
				
			
			@ -1075,7 +1075,7 @@ class Processor
 | 
			
		|||
			}
 | 
			
		||||
 | 
			
		||||
			if (($receiver != 0) && ($item['gravity'] == Item::GRAVITY_PARENT) && !in_array($item['post-reason'], [Item::PR_FOLLOWER, Item::PR_TAG, item::PR_TO, Item::PR_CC, Item::PR_AUDIENCE])) {
 | 
			
		||||
				if (!($item['isForum'] ?? false)) {
 | 
			
		||||
				if (!($item['isGroup'] ?? false)) {
 | 
			
		||||
					if ($item['post-reason'] == Item::PR_BCC) {
 | 
			
		||||
						Logger::info('Top level post via BCC from a non sharer, ignoring', ['uid' => $receiver, 'contact' => $item['contact-id'], 'url' => $item['uri']]);
 | 
			
		||||
						continue;
 | 
			
		||||
| 
						 | 
				
			
			@ -1089,16 +1089,16 @@ class Processor
 | 
			
		|||
					}
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				$is_forum = false;
 | 
			
		||||
				$isGroup = false;
 | 
			
		||||
				$user = User::getById($receiver, ['account-type']);
 | 
			
		||||
				if (!empty($user['account-type'])) {
 | 
			
		||||
					$is_forum = ($user['account-type'] == User::ACCOUNT_TYPE_COMMUNITY);
 | 
			
		||||
					$isGroup = ($user['account-type'] == User::ACCOUNT_TYPE_COMMUNITY);
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				if ((DI::pConfig()->get($receiver, 'system', 'accept_only_sharer') == Item::COMPLETION_NONE)
 | 
			
		||||
					&& ((!$is_forum && !($item['isForum'] ?? false) && ($activity['type'] != 'as:Announce'))
 | 
			
		||||
					&& ((!$isGroup && !($item['isGroup'] ?? false) && ($activity['type'] != 'as:Announce'))
 | 
			
		||||
					|| !Contact::isSharingByURL($activity['actor'], $receiver))) {
 | 
			
		||||
					Logger::info('Actor is a non sharer, is no forum or it is no announce', ['uid' => $receiver, 'actor' => $activity['actor'], 'url' => $item['uri'], 'type' => $activity['type']]);
 | 
			
		||||
					Logger::info('Actor is a non sharer, is no group or it is no announce', ['uid' => $receiver, 'actor' => $activity['actor'], 'url' => $item['uri'], 'type' => $activity['type']]);
 | 
			
		||||
					continue;
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1141,7 +1141,7 @@ class Processor
 | 
			
		|||
		// Store send a follow request for every reshare - but only when the item had been stored
 | 
			
		||||
		if ($stored && ($item['private'] != Item::PRIVATE) && ($item['gravity'] == Item::GRAVITY_PARENT) && !empty($item['author-link']) && ($item['author-link'] != $item['owner-link'])) {
 | 
			
		||||
			$author = APContact::getByURL($item['owner-link'], false);
 | 
			
		||||
			// We send automatic follow requests for reshared messages. (We don't need though for forum posts)
 | 
			
		||||
			// We send automatic follow requests for reshared messages. (We don't need though for group posts)
 | 
			
		||||
			if ($author['type'] != 'Group') {
 | 
			
		||||
				Logger::info('Send follow request', ['uri' => $item['uri'], 'stored' => $stored, 'to' => $item['author-link']]);
 | 
			
		||||
				ActivityPub\Transmitter::sendFollowObject($item['uri'], $item['author-link']);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1098,7 +1098,7 @@ class Receiver
 | 
			
		|||
		if (!empty($actor)) {
 | 
			
		||||
			$profile   = APContact::getByURL($actor);
 | 
			
		||||
			$followers = $profile['followers'] ?? '';
 | 
			
		||||
			$is_forum  = ($profile['type'] ?? '') == 'Group';
 | 
			
		||||
			$isGroup  = ($profile['type'] ?? '') == 'Group';
 | 
			
		||||
			if ($push) {
 | 
			
		||||
				Contact::updateByUrlIfNeeded($actor);
 | 
			
		||||
			}
 | 
			
		||||
| 
						 | 
				
			
			@ -1106,7 +1106,7 @@ class Receiver
 | 
			
		|||
		} else {
 | 
			
		||||
			Logger::info('Empty actor', ['activity' => $activity]);
 | 
			
		||||
			$followers = '';
 | 
			
		||||
			$is_forum  = false;
 | 
			
		||||
			$isGroup  = false;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// We have to prevent false follower assumptions upon thread completions
 | 
			
		||||
| 
						 | 
				
			
			@ -1129,7 +1129,7 @@ class Receiver
 | 
			
		|||
				}
 | 
			
		||||
 | 
			
		||||
				// Fetch the receivers for the public and the followers collection
 | 
			
		||||
				if ((($receiver == $followers) || (($receiver == self::PUBLIC_COLLECTION) && !$is_forum)) && !empty($actor)) {
 | 
			
		||||
				if ((($receiver == $followers) || (($receiver == self::PUBLIC_COLLECTION) && !$isGroup)) && !empty($actor)) {
 | 
			
		||||
					$receivers = self::getReceiverForActor($actor, $tags, $receivers, $follower_target, $profile);
 | 
			
		||||
					continue;
 | 
			
		||||
				}
 | 
			
		||||
| 
						 | 
				
			
			@ -1148,7 +1148,7 @@ class Receiver
 | 
			
		|||
					$condition = ['nurl' => Strings::normaliseLink($actor), 'rel' => [Contact::SHARING, Contact::FRIEND],
 | 
			
		||||
						'network' => $networks, 'archive' => false, 'pending' => false, 'uid' => $contact['uid']];
 | 
			
		||||
 | 
			
		||||
					// Forum posts are only accepted from forum contacts
 | 
			
		||||
					// Group posts are only accepted from group contacts
 | 
			
		||||
					if ($contact['contact-type'] == Contact::TYPE_COMMUNITY) {
 | 
			
		||||
						$condition['rel'] = [Contact::SHARING, Contact::FRIEND, Contact::FOLLOWER];
 | 
			
		||||
					}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -492,13 +492,13 @@ class Transmitter
 | 
			
		|||
	 * Returns an array with permissions of the thread parent of the given item array
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param array $item
 | 
			
		||||
	 * @param bool  $is_forum_thread
 | 
			
		||||
	 * @param bool  $is_group_thread
 | 
			
		||||
	 *
 | 
			
		||||
	 * @return array with permissions
 | 
			
		||||
	 * @throws \Friendica\Network\HTTPException\InternalServerErrorException
 | 
			
		||||
	 * @throws \ImagickException
 | 
			
		||||
	 */
 | 
			
		||||
	private static function fetchPermissionBlockFromThreadParent(array $item, bool $is_forum_thread): array
 | 
			
		||||
	private static function fetchPermissionBlockFromThreadParent(array $item, bool $is_group_thread): array
 | 
			
		||||
	{
 | 
			
		||||
		if (empty($item['thr-parent-id'])) {
 | 
			
		||||
			return [];
 | 
			
		||||
| 
						 | 
				
			
			@ -528,7 +528,7 @@ class Transmitter
 | 
			
		|||
		$type = [Tag::TO => 'to', Tag::CC => 'cc', Tag::BTO => 'bto', Tag::BCC => 'bcc'];
 | 
			
		||||
		foreach (Tag::getByURIId($item['thr-parent-id'], [Tag::TO, Tag::CC, Tag::BTO, Tag::BCC]) as $receiver) {
 | 
			
		||||
			if (!empty($parent_profile['followers']) && $receiver['url'] == $parent_profile['followers'] && !empty($item_profile['followers'])) {
 | 
			
		||||
				if (!$is_forum_thread) {
 | 
			
		||||
				if (!$is_group_thread) {
 | 
			
		||||
					$permissions[$type[$receiver['type']]][] = $item_profile['followers'];
 | 
			
		||||
				}
 | 
			
		||||
			} elseif (!in_array($receiver['url'], $exclude)) {
 | 
			
		||||
| 
						 | 
				
			
			@ -573,7 +573,7 @@ class Transmitter
 | 
			
		|||
		}
 | 
			
		||||
 | 
			
		||||
		$always_bcc = false;
 | 
			
		||||
		$is_forum   = false;
 | 
			
		||||
		$is_group   = false;
 | 
			
		||||
		$follower   = '';
 | 
			
		||||
 | 
			
		||||
		// Check if we should always deliver our stuff via BCC
 | 
			
		||||
| 
						 | 
				
			
			@ -581,7 +581,7 @@ class Transmitter
 | 
			
		|||
			$owner = User::getOwnerDataById($item['uid']);
 | 
			
		||||
			if (!empty($owner)) {
 | 
			
		||||
				$always_bcc = $owner['hide-friends'];
 | 
			
		||||
				$is_forum   = ($owner['account-type'] == User::ACCOUNT_TYPE_COMMUNITY) && $owner['manually-approve'];
 | 
			
		||||
				$is_group   = ($owner['account-type'] == User::ACCOUNT_TYPE_COMMUNITY) && $owner['manually-approve'];
 | 
			
		||||
 | 
			
		||||
				$profile  = APContact::getByURL($owner['url'], false);
 | 
			
		||||
				$follower = $profile['followers'] ?? '';
 | 
			
		||||
| 
						 | 
				
			
			@ -595,9 +595,9 @@ class Transmitter
 | 
			
		|||
		$parent = Post::selectFirst(['causer-link', 'post-reason'], ['id' => $item['parent']]);
 | 
			
		||||
		if (!empty($parent) && ($parent['post-reason'] == Item::PR_ANNOUNCEMENT) && !empty($parent['causer-link'])) {
 | 
			
		||||
			$profile = APContact::getByURL($parent['causer-link'], false);
 | 
			
		||||
			$is_forum_thread = isset($profile['type']) && $profile['type'] == 'Group';
 | 
			
		||||
			$is_group_thread = isset($profile['type']) && $profile['type'] == 'Group';
 | 
			
		||||
		} else {
 | 
			
		||||
			$is_forum_thread = false;
 | 
			
		||||
			$is_group_thread = false;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (self::isAnnounce($item) || self::isAPPost($last_id)) {
 | 
			
		||||
| 
						 | 
				
			
			@ -619,7 +619,7 @@ class Transmitter
 | 
			
		|||
		$exclusive = false;
 | 
			
		||||
		$mention   = false;
 | 
			
		||||
 | 
			
		||||
		if ($is_forum_thread) {
 | 
			
		||||
		if ($is_group_thread) {
 | 
			
		||||
			foreach (Tag::getByURIId($item['parent-uri-id'], [Tag::MENTION, Tag::EXCLUSIVE_MENTION]) as $term) {
 | 
			
		||||
				$profile = APContact::getByURL($term['url'], false);
 | 
			
		||||
				if (!empty($profile) && ($profile['type'] == 'Group')) {
 | 
			
		||||
| 
						 | 
				
			
			@ -644,7 +644,7 @@ class Transmitter
 | 
			
		|||
				$data['cc'][] = $announce['actor']['url'];
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			$data = array_merge($data, self::fetchPermissionBlockFromThreadParent($item, $is_forum_thread));
 | 
			
		||||
			$data = array_merge($data, self::fetchPermissionBlockFromThreadParent($item, $is_group_thread));
 | 
			
		||||
 | 
			
		||||
			// Check if the item is completely public or unlisted
 | 
			
		||||
			if ($item['private'] == Item::PUBLIC) {
 | 
			
		||||
| 
						 | 
				
			
			@ -702,7 +702,7 @@ class Transmitter
 | 
			
		|||
				$exclusive = false;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if ($is_forum && !$exclusive && !empty($follower)) {
 | 
			
		||||
			if ($is_group && !$exclusive && !empty($follower)) {
 | 
			
		||||
				$data['cc'][] = $follower;
 | 
			
		||||
			} elseif (!$exclusive) {
 | 
			
		||||
				foreach ($receiver_list as $receiver) {
 | 
			
		||||
| 
						 | 
				
			
			@ -739,19 +739,19 @@ class Transmitter
 | 
			
		|||
					$profile = APContact::getByURL($parent['owner-link'], false);
 | 
			
		||||
					if (!empty($profile)) {
 | 
			
		||||
						if ($item['gravity'] != Item::GRAVITY_PARENT) {
 | 
			
		||||
							// Comments to forums are directed to the forum
 | 
			
		||||
							// But comments to forums aren't directed to the followers collection
 | 
			
		||||
							// This rule is only valid when the actor isn't the forum.
 | 
			
		||||
							// The forum needs to transmit their content to their followers.
 | 
			
		||||
							// Comments to groups are directed to the group
 | 
			
		||||
							// But comments to groups aren't directed to the followers collection
 | 
			
		||||
							// This rule is only valid when the actor isn't the group.
 | 
			
		||||
							// The group needs to transmit their content to their followers.
 | 
			
		||||
							if (($profile['type'] == 'Group') && ($profile['url'] != ($actor_profile['url'] ?? ''))) {
 | 
			
		||||
								$data['to'][] = $profile['url'];
 | 
			
		||||
							} else {
 | 
			
		||||
								$data['cc'][] = $profile['url'];
 | 
			
		||||
								if (($item['private'] != Item::PRIVATE) && !empty($actor_profile['followers']) && (!$exclusive || !$is_forum_thread)) {
 | 
			
		||||
								if (($item['private'] != Item::PRIVATE) && !empty($actor_profile['followers']) && (!$exclusive || !$is_group_thread)) {
 | 
			
		||||
									$data['cc'][] = $actor_profile['followers'];
 | 
			
		||||
								}
 | 
			
		||||
							}
 | 
			
		||||
						} elseif (!$exclusive && !$is_forum_thread) {
 | 
			
		||||
						} elseif (!$exclusive && !$is_group_thread) {
 | 
			
		||||
							// Public thread parent post always are directed to the followers.
 | 
			
		||||
							if ($item['private'] != Item::PRIVATE) {
 | 
			
		||||
								$data['cc'][] = $actor_profile['followers'];
 | 
			
		||||
| 
						 | 
				
			
			@ -885,12 +885,11 @@ class Transmitter
 | 
			
		|||
	{
 | 
			
		||||
		$inboxes = [];
 | 
			
		||||
 | 
			
		||||
		$isforum = false;
 | 
			
		||||
 | 
			
		||||
		$isGroup = false;
 | 
			
		||||
		if (!empty($item['uid'])) {
 | 
			
		||||
			$profile = User::getOwnerDataById($item['uid']);
 | 
			
		||||
			if (!empty($profile)) {
 | 
			
		||||
				$isforum = $profile['account-type'] == User::ACCOUNT_TYPE_COMMUNITY;
 | 
			
		||||
				$isGroup = $profile['account-type'] == User::ACCOUNT_TYPE_COMMUNITY;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -920,7 +919,7 @@ class Transmitter
 | 
			
		|||
				continue;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if ($isforum && ($contact['network'] == Protocol::DFRN)) {
 | 
			
		||||
			if ($isGroup && ($contact['network'] == Protocol::DFRN)) {
 | 
			
		||||
				continue;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2220,8 +2220,8 @@ class DFRN
 | 
			
		|||
			GServer::setProtocol($importer['gsid'], Post\DeliveryData::DFRN);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// is it a public forum? Private forums aren't exposed with this method
 | 
			
		||||
		$forum = intval(XML::getFirstNodeValue($xpath, '/atom:feed/dfrn:community/text()'));
 | 
			
		||||
		// is it a public group? Private groups aren't exposed with this method
 | 
			
		||||
		$group = intval(XML::getFirstNodeValue($xpath, '/atom:feed/dfrn:community/text()'));
 | 
			
		||||
 | 
			
		||||
		// The account type is new since 3.5.1
 | 
			
		||||
		if ($xpath->query('/atom:feed/dfrn:account_type')->length > 0) {
 | 
			
		||||
| 
						 | 
				
			
			@ -2235,17 +2235,17 @@ class DFRN
 | 
			
		|||
				// Updating the public contact as well
 | 
			
		||||
				Contact::update(['contact-type' => $accounttype], ['uid' => 0, 'nurl' => $importer['nurl']]);
 | 
			
		||||
			}
 | 
			
		||||
			// A forum contact can either have set "forum" or "prv" - but not both
 | 
			
		||||
			// A group contact can either have set "forum" or "prv" - but not both
 | 
			
		||||
			if ($accounttype == User::ACCOUNT_TYPE_COMMUNITY) {
 | 
			
		||||
				// It's a forum, so either set the public or private forum flag
 | 
			
		||||
				$condition = ['(`forum` != ? OR `prv` != ?) AND `id` = ?', $forum, !$forum, $importer['id']];
 | 
			
		||||
				Contact::update(['forum' => $forum, 'prv' => !$forum], $condition);
 | 
			
		||||
				// It's a group, so either set the public or private forum flag
 | 
			
		||||
				$condition = ['(`forum` != ? OR `prv` != ?) AND `id` = ?', $group, !$group, $importer['id']];
 | 
			
		||||
				Contact::update(['forum' => $group, 'prv' => !$group], $condition);
 | 
			
		||||
 | 
			
		||||
				// Updating the public contact as well
 | 
			
		||||
				$condition = ['(`forum` != ? OR `prv` != ?) AND `uid` = 0 AND `nurl` = ?', $forum, !$forum, $importer['nurl']];
 | 
			
		||||
				Contact::update(['forum' => $forum, 'prv' => !$forum], $condition);
 | 
			
		||||
				$condition = ['(`forum` != ? OR `prv` != ?) AND `uid` = 0 AND `nurl` = ?', $group, !$group, $importer['nurl']];
 | 
			
		||||
				Contact::update(['forum' => $group, 'prv' => !$group], $condition);
 | 
			
		||||
			} else {
 | 
			
		||||
				// It's not a forum, so remove the flags
 | 
			
		||||
				// It's not a group, so remove the flags
 | 
			
		||||
				$condition = ['(`forum` OR `prv`) AND `id` = ?', $importer['id']];
 | 
			
		||||
				Contact::update(['forum' => false, 'prv' => false], $condition);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -2253,13 +2253,13 @@ class DFRN
 | 
			
		|||
				$condition = ['(`forum` OR `prv`) AND `uid` = 0 AND `nurl` = ?', $importer['nurl']];
 | 
			
		||||
				Contact::update(['forum' => false, 'prv' => false], $condition);
 | 
			
		||||
			}
 | 
			
		||||
		} elseif ($forum != $importer['forum']) { // Deprecated since 3.5.1
 | 
			
		||||
			$condition = ['`forum` != ? AND `id` = ?', $forum, $importer['id']];
 | 
			
		||||
			Contact::update(['forum' => $forum], $condition);
 | 
			
		||||
		} elseif ($group != $importer['forum']) { // Deprecated since 3.5.1
 | 
			
		||||
			$condition = ['`forum` != ? AND `id` = ?', $group, $importer['id']];
 | 
			
		||||
			Contact::update(['forum' => $group], $condition);
 | 
			
		||||
 | 
			
		||||
			// Updating the public contact as well
 | 
			
		||||
			$condition = ['`forum` != ? AND `uid` = 0 AND `nurl` = ?', $forum, $importer['nurl']];
 | 
			
		||||
			Contact::update(['forum' => $forum], $condition);
 | 
			
		||||
			$condition = ['`forum` != ? AND `uid` = 0 AND `nurl` = ?', $group, $importer['nurl']];
 | 
			
		||||
			Contact::update(['forum' => $group], $condition);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -404,7 +404,7 @@ class Delivery
 | 
			
		|||
	 */
 | 
			
		||||
	private static function deliverDiaspora(string $cmd, array $contact, array $owner, array $items, array $target_item, bool $public_message, bool $top_level, bool $followup): bool
 | 
			
		||||
	{
 | 
			
		||||
		// We don't treat Forum posts as "wall-to-wall" to be able to post them via Diaspora
 | 
			
		||||
		// We don't treat group posts as "wall-to-wall" to be able to post them via Diaspora
 | 
			
		||||
		$walltowall = $top_level && ($owner['id'] != $items[0]['contact-id']) & ($owner['account-type'] != User::ACCOUNT_TYPE_COMMUNITY);
 | 
			
		||||
 | 
			
		||||
		if ($public_message) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -36,7 +36,7 @@ class ExpireAndRemoveUsers
 | 
			
		|||
{
 | 
			
		||||
	public static function execute()
 | 
			
		||||
	{
 | 
			
		||||
		// expire any expired regular accounts. Don't expire forums.
 | 
			
		||||
		// expire any expired regular accounts. Don't expire groups.
 | 
			
		||||
		$condition = ["NOT `account_expired` AND `account_expires_on` > ? AND `account_expires_on` < ? AND `page-flags` = ? AND `uid` != ?",
 | 
			
		||||
			DBA::NULL_DATETIME, DateTimeFormat::utcNow(), User::PAGE_FLAGS_NORMAL, 0];
 | 
			
		||||
		DBA::update('user', ['account_expired' => true], $condition);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -167,8 +167,8 @@ class Notifier
 | 
			
		|||
		// Do a PuSH
 | 
			
		||||
		$push_notify = false;
 | 
			
		||||
 | 
			
		||||
		// Deliver directly to a forum, don't PuSH
 | 
			
		||||
		$direct_forum_delivery = false;
 | 
			
		||||
		// Deliver directly to a group, don't PuSH
 | 
			
		||||
		$direct_group_delivery = false;
 | 
			
		||||
 | 
			
		||||
		$only_ap_delivery = false;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -249,15 +249,15 @@ class Notifier
 | 
			
		|||
				$relay_to_owner = false;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			// Special treatment for forum posts
 | 
			
		||||
			if (Item::isForumPost($target_item['uri-id'])) {
 | 
			
		||||
			// Special treatment for group posts
 | 
			
		||||
			if (Item::isGroupPost($target_item['uri-id'])) {
 | 
			
		||||
				$relay_to_owner = true;
 | 
			
		||||
				$direct_forum_delivery = true;
 | 
			
		||||
				$direct_group_delivery = true;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			// Avoid that comments in a forum thread are sent to OStatus
 | 
			
		||||
			if (Item::isForumPost($parent['uri-id'])) {
 | 
			
		||||
				$direct_forum_delivery = true;
 | 
			
		||||
			// Avoid that comments in a group thread are sent to OStatus
 | 
			
		||||
			if (Item::isGroupPost($parent['uri-id'])) {
 | 
			
		||||
				$direct_group_delivery = true;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			$exclusive_delivery = false;
 | 
			
		||||
| 
						 | 
				
			
			@ -303,7 +303,7 @@ class Notifier
 | 
			
		|||
					}
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				if ($direct_forum_delivery) {
 | 
			
		||||
				if ($direct_group_delivery) {
 | 
			
		||||
					$push_notify = false;
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -793,11 +793,11 @@ class Notifier
 | 
			
		|||
 | 
			
		||||
		$uid = $target_item['contact-uid'] ?: $target_item['uid'];
 | 
			
		||||
 | 
			
		||||
		// Update the locally stored follower list when we deliver to a forum
 | 
			
		||||
		// Update the locally stored follower list when we deliver to a group
 | 
			
		||||
		foreach (Tag::getByURIId($target_item['uri-id'], [Tag::MENTION, Tag::EXCLUSIVE_MENTION]) as $tag) {
 | 
			
		||||
			$target_contact = Contact::getByURL(Strings::normaliseLink($tag['url']), null, [], $uid);
 | 
			
		||||
			if ($target_contact && $target_contact['contact-type'] == Contact::TYPE_COMMUNITY && $target_contact['manually-approve']) {
 | 
			
		||||
				Circle::updateMembersForForum($target_contact['id']);
 | 
			
		||||
				Circle::updateMembersForGroup($target_contact['id']);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue