"Contact\User" class created
This commit is contained in:
		
					parent
					
						
							
								afa9adda6e
							
						
					
				
			
			
				commit
				
					
						a7d75702cc
					
				
			
		
					 9 changed files with 330 additions and 299 deletions
				
			
		| 
						 | 
				
			
			@ -39,7 +39,7 @@ function suggest_content(App $a)
 | 
			
		|||
	DI::page()['aside'] .= Widget::findPeople();
 | 
			
		||||
	DI::page()['aside'] .= Widget::follow();
 | 
			
		||||
 | 
			
		||||
	$contacts = Contact::getSuggestions(local_user());
 | 
			
		||||
	$contacts = Contact\Relation::getSuggestions(local_user());
 | 
			
		||||
	if (!DBA::isResult($contacts)) {
 | 
			
		||||
		return DI::l10n()->t('No suggestions available. If this is a new site, please try again in 24 hours.');
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -111,7 +111,7 @@ class Session
 | 
			
		|||
 | 
			
		||||
		$remote_contacts = DBA::select('contact', ['id', 'uid'], ['nurl' => Strings::normaliseLink($session->get('my_url')), 'rel' => [Contact::FOLLOWER, Contact::FRIEND], 'self' => false]);
 | 
			
		||||
		while ($contact = DBA::fetch($remote_contacts)) {
 | 
			
		||||
			if (($contact['uid'] == 0) || Contact::isBlockedByUser($contact['id'], $contact['uid'])) {
 | 
			
		||||
			if (($contact['uid'] == 0) || Contact\User::isBlocked($contact['id'], $contact['uid'])) {
 | 
			
		||||
				continue;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -306,7 +306,7 @@ class Contact
 | 
			
		|||
	 */
 | 
			
		||||
	public static function isFollower($cid, $uid)
 | 
			
		||||
	{
 | 
			
		||||
		if (self::isBlockedByUser($cid, $uid)) {
 | 
			
		||||
		if (Contact\User::isBlocked($cid, $uid)) {
 | 
			
		||||
			return false;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -352,7 +352,7 @@ class Contact
 | 
			
		|||
	 */
 | 
			
		||||
	public static function isSharing($cid, $uid)
 | 
			
		||||
	{
 | 
			
		||||
		if (self::isBlockedByUser($cid, $uid)) {
 | 
			
		||||
		if (Contact\User::isBlocked($cid, $uid)) {
 | 
			
		||||
			return false;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -537,179 +537,6 @@ class Contact
 | 
			
		|||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Block contact id for user id
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param int     $cid     Either public contact id or user's contact id
 | 
			
		||||
	 * @param int     $uid     User ID
 | 
			
		||||
	 * @param boolean $blocked Is the contact blocked or unblocked?
 | 
			
		||||
	 * @throws \Exception
 | 
			
		||||
	 */
 | 
			
		||||
	public static function setBlockedForUser($cid, $uid, $blocked)
 | 
			
		||||
	{
 | 
			
		||||
		$cdata = self::getPublicAndUserContacID($cid, $uid);
 | 
			
		||||
		if (empty($cdata)) {
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if ($cdata['user'] != 0) {
 | 
			
		||||
			DBA::update('contact', ['blocked' => $blocked], ['id' => $cdata['user'], 'pending' => false]);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		DBA::update('user-contact', ['blocked' => $blocked], ['cid' => $cdata['public'], 'uid' => $uid], true);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Returns "block" state for contact id and user id
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param int $cid Either public contact id or user's contact id
 | 
			
		||||
	 * @param int $uid User ID
 | 
			
		||||
	 *
 | 
			
		||||
	 * @return boolean is the contact id blocked for the given user?
 | 
			
		||||
	 * @throws \Exception
 | 
			
		||||
	 */
 | 
			
		||||
	public static function isBlockedByUser($cid, $uid)
 | 
			
		||||
	{
 | 
			
		||||
		$cdata = self::getPublicAndUserContacID($cid, $uid);
 | 
			
		||||
		if (empty($cdata)) {
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		$public_blocked = false;
 | 
			
		||||
 | 
			
		||||
		if (!empty($cdata['public'])) {
 | 
			
		||||
			$public_contact = DBA::selectFirst('user-contact', ['blocked'], ['cid' => $cdata['public'], 'uid' => $uid]);
 | 
			
		||||
			if (DBA::isResult($public_contact)) {
 | 
			
		||||
				$public_blocked = $public_contact['blocked'];
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		$user_blocked = $public_blocked;
 | 
			
		||||
 | 
			
		||||
		if (!empty($cdata['user'])) {
 | 
			
		||||
			$user_contact = DBA::selectFirst('contact', ['blocked'], ['id' => $cdata['user'], 'pending' => false]);
 | 
			
		||||
			if (DBA::isResult($user_contact)) {
 | 
			
		||||
				$user_blocked = $user_contact['blocked'];
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if ($user_blocked != $public_blocked) {
 | 
			
		||||
			DBA::update('user-contact', ['blocked' => $user_blocked], ['cid' => $cdata['public'], 'uid' => $uid], true);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return $user_blocked;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Ignore contact id for user id
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param int     $cid     Either public contact id or user's contact id
 | 
			
		||||
	 * @param int     $uid     User ID
 | 
			
		||||
	 * @param boolean $ignored Is the contact ignored or unignored?
 | 
			
		||||
	 * @throws \Exception
 | 
			
		||||
	 */
 | 
			
		||||
	public static function setIgnoredForUser($cid, $uid, $ignored)
 | 
			
		||||
	{
 | 
			
		||||
		$cdata = self::getPublicAndUserContacID($cid, $uid);
 | 
			
		||||
		if (empty($cdata)) {
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if ($cdata['user'] != 0) {
 | 
			
		||||
			DBA::update('contact', ['readonly' => $ignored], ['id' => $cdata['user'], 'pending' => false]);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		DBA::update('user-contact', ['ignored' => $ignored], ['cid' => $cdata['public'], 'uid' => $uid], true);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Returns "ignore" state for contact id and user id
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param int $cid Either public contact id or user's contact id
 | 
			
		||||
	 * @param int $uid User ID
 | 
			
		||||
	 *
 | 
			
		||||
	 * @return boolean is the contact id ignored for the given user?
 | 
			
		||||
	 * @throws \Exception
 | 
			
		||||
	 */
 | 
			
		||||
	public static function isIgnoredByUser($cid, $uid)
 | 
			
		||||
	{
 | 
			
		||||
		$cdata = self::getPublicAndUserContacID($cid, $uid);
 | 
			
		||||
		if (empty($cdata)) {
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		$public_ignored = false;
 | 
			
		||||
 | 
			
		||||
		if (!empty($cdata['public'])) {
 | 
			
		||||
			$public_contact = DBA::selectFirst('user-contact', ['ignored'], ['cid' => $cdata['public'], 'uid' => $uid]);
 | 
			
		||||
			if (DBA::isResult($public_contact)) {
 | 
			
		||||
				$public_ignored = $public_contact['ignored'];
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		$user_ignored = $public_ignored;
 | 
			
		||||
 | 
			
		||||
		if (!empty($cdata['user'])) {
 | 
			
		||||
			$user_contact = DBA::selectFirst('contact', ['readonly'], ['id' => $cdata['user'], 'pending' => false]);
 | 
			
		||||
			if (DBA::isResult($user_contact)) {
 | 
			
		||||
				$user_ignored = $user_contact['readonly'];
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if ($user_ignored != $public_ignored) {
 | 
			
		||||
			DBA::update('user-contact', ['ignored' => $user_ignored], ['cid' => $cdata['public'], 'uid' => $uid], true);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return $user_ignored;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Set "collapsed" for contact id and user id
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param int     $cid       Either public contact id or user's contact id
 | 
			
		||||
	 * @param int     $uid       User ID
 | 
			
		||||
	 * @param boolean $collapsed are the contact's posts collapsed or uncollapsed?
 | 
			
		||||
	 * @throws \Exception
 | 
			
		||||
	 */
 | 
			
		||||
	public static function setCollapsedForUser($cid, $uid, $collapsed)
 | 
			
		||||
	{
 | 
			
		||||
		$cdata = self::getPublicAndUserContacID($cid, $uid);
 | 
			
		||||
		if (empty($cdata)) {
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		DBA::update('user-contact', ['collapsed' => $collapsed], ['cid' => $cdata['public'], 'uid' => $uid], true);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Returns "collapsed" state for contact id and user id
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param int $cid Either public contact id or user's contact id
 | 
			
		||||
	 * @param int $uid User ID
 | 
			
		||||
	 *
 | 
			
		||||
	 * @return boolean is the contact id blocked for the given user?
 | 
			
		||||
	 * @throws HTTPException\InternalServerErrorException
 | 
			
		||||
	 * @throws \ImagickException
 | 
			
		||||
	 */
 | 
			
		||||
	public static function isCollapsedByUser($cid, $uid)
 | 
			
		||||
	{
 | 
			
		||||
		$cdata = self::getPublicAndUserContacID($cid, $uid);
 | 
			
		||||
		if (empty($cdata)) {
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		$collapsed = false;
 | 
			
		||||
 | 
			
		||||
		if (!empty($cdata['public'])) {
 | 
			
		||||
			$public_contact = DBA::selectFirst('user-contact', ['collapsed'], ['cid' => $cdata['public'], 'uid' => $uid]);
 | 
			
		||||
			if (DBA::isResult($public_contact)) {
 | 
			
		||||
				$collapsed = $public_contact['collapsed'];
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return $collapsed;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Returns a list of contacts belonging in a group
 | 
			
		||||
	 *
 | 
			
		||||
| 
						 | 
				
			
			@ -2588,7 +2415,7 @@ class Contact
 | 
			
		|||
 | 
			
		||||
			// Contact is blocked at user-level
 | 
			
		||||
			if (!empty($contact['id']) && !empty($importer['id']) &&
 | 
			
		||||
				self::isBlockedByUser($contact['id'], $importer['id'])) {
 | 
			
		||||
				Contact\User::isBlocked($contact['id'], $importer['id'])) {
 | 
			
		||||
				return false;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -2952,110 +2779,6 @@ class Contact
 | 
			
		|||
		return $contacts;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @param int $uid   user
 | 
			
		||||
	 * @param int $start optional, default 0
 | 
			
		||||
	 * @param int $limit optional, default 80
 | 
			
		||||
	 * @return array
 | 
			
		||||
	 */
 | 
			
		||||
	static public function getSuggestions(int $uid, int $start = 0, int $limit = 80)
 | 
			
		||||
	{
 | 
			
		||||
		$cid = self::getPublicIdByUserId($uid);
 | 
			
		||||
		$totallimit = $start + $limit;
 | 
			
		||||
		$contacts = [];
 | 
			
		||||
 | 
			
		||||
		Logger::info('Collecting suggestions', ['uid' => $uid, 'cid' => $cid, 'start' => $start, 'limit' => $limit]);
 | 
			
		||||
 | 
			
		||||
		$diaspora = DI::config()->get('system', 'diaspora_enabled') ? Protocol::DIASPORA : Protocol::ACTIVITYPUB;
 | 
			
		||||
		$ostatus = !DI::config()->get('system', 'ostatus_disabled') ? Protocol::OSTATUS : Protocol::ACTIVITYPUB;
 | 
			
		||||
 | 
			
		||||
		// The query returns contacts where contacts interacted with whom the given user follows.
 | 
			
		||||
		// Contacts who already are in the user's contact table are ignored.
 | 
			
		||||
		$results = DBA::select('contact', [],
 | 
			
		||||
			["`id` IN (SELECT `cid` FROM `contact-relation` WHERE `relation-cid` IN
 | 
			
		||||
				(SELECT `cid` FROM `contact-relation` WHERE `relation-cid` = ?)
 | 
			
		||||
					AND NOT `cid` IN (SELECT `id` FROM `contact` WHERE `uid` = ? AND `nurl` IN
 | 
			
		||||
						(SELECT `nurl` FROM `contact` WHERE `uid` = ? AND `rel` IN (?, ?))))
 | 
			
		||||
			AND NOT `hidden` AND `network` IN (?, ?, ?, ?)",
 | 
			
		||||
			$cid, 0, $uid, Contact::FRIEND, Contact::SHARING,
 | 
			
		||||
			Protocol::ACTIVITYPUB, Protocol::DFRN, $diaspora, $ostatus],
 | 
			
		||||
			['order' => ['last-item' => true], 'limit' => $totallimit]
 | 
			
		||||
		);
 | 
			
		||||
 | 
			
		||||
		while ($contact = DBA::fetch($results)) {
 | 
			
		||||
			$contacts[$contact['id']] = $contact;
 | 
			
		||||
		}
 | 
			
		||||
		DBA::close($results);
 | 
			
		||||
 | 
			
		||||
		Logger::info('Contacts of contacts who are followed by the given user', ['uid' => $uid, 'cid' => $cid, 'count' => count($contacts)]);
 | 
			
		||||
 | 
			
		||||
		if (count($contacts) >= $totallimit) {
 | 
			
		||||
			return array_slice($contacts, $start, $limit);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// The query returns contacts where contacts interacted with whom also interacted with the given user.
 | 
			
		||||
		// Contacts who already are in the user's contact table are ignored.
 | 
			
		||||
		$results = DBA::select('contact', [],
 | 
			
		||||
			["`id` IN (SELECT `cid` FROM `contact-relation` WHERE `relation-cid` IN
 | 
			
		||||
				(SELECT `relation-cid` FROM `contact-relation` WHERE `cid` = ?)
 | 
			
		||||
					AND NOT `cid` IN (SELECT `id` FROM `contact` WHERE `uid` = ? AND `nurl` IN
 | 
			
		||||
						(SELECT `nurl` FROM `contact` WHERE `uid` = ? AND `rel` IN (?, ?))))
 | 
			
		||||
			AND NOT `hidden` AND `network` IN (?, ?, ?, ?)",
 | 
			
		||||
			$cid, 0, $uid, Contact::FRIEND, Contact::SHARING,
 | 
			
		||||
			Protocol::ACTIVITYPUB, Protocol::DFRN, $diaspora, $ostatus],
 | 
			
		||||
			['order' => ['last-item' => true], 'limit' => $totallimit]
 | 
			
		||||
		);
 | 
			
		||||
 | 
			
		||||
		while ($contact = DBA::fetch($results)) {
 | 
			
		||||
			$contacts[$contact['id']] = $contact;
 | 
			
		||||
		}
 | 
			
		||||
		DBA::close($results);
 | 
			
		||||
 | 
			
		||||
		Logger::info('Contacts of contacts who are following the given user', ['uid' => $uid, 'cid' => $cid, 'count' => count($contacts)]);
 | 
			
		||||
 | 
			
		||||
		if (count($contacts) >= $totallimit) {
 | 
			
		||||
			return array_slice($contacts, $start, $limit);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// The query returns contacts that follow the given user but aren't followed by that user.
 | 
			
		||||
		$results = DBA::select('contact', [],
 | 
			
		||||
			["`nurl` IN (SELECT `nurl` FROM `contact` WHERE `uid` = ? AND `rel` = ?)
 | 
			
		||||
			AND NOT `hidden` AND `uid` = ? AND `network` IN (?, ?, ?, ?)",
 | 
			
		||||
			$uid, Contact::FOLLOWER, 0, 
 | 
			
		||||
			Protocol::ACTIVITYPUB, Protocol::DFRN, $diaspora, $ostatus],
 | 
			
		||||
			['order' => ['last-item' => true], 'limit' => $totallimit]
 | 
			
		||||
		);
 | 
			
		||||
 | 
			
		||||
		while ($contact = DBA::fetch($results)) {
 | 
			
		||||
			$contacts[$contact['id']] = $contact;
 | 
			
		||||
		}
 | 
			
		||||
		DBA::close($results);
 | 
			
		||||
 | 
			
		||||
		Logger::info('Followers that are not followed by the given user', ['uid' => $uid, 'cid' => $cid, 'count' => count($contacts)]);
 | 
			
		||||
 | 
			
		||||
		if (count($contacts) >= $totallimit) {
 | 
			
		||||
			return array_slice($contacts, $start, $limit);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// The query returns any contact that isn't followed by that user.
 | 
			
		||||
		$results = DBA::select('contact', [],
 | 
			
		||||
			["NOT `nurl` IN (SELECT `nurl` FROM `contact` WHERE `uid` = ? AND `rel` IN (?, ?))
 | 
			
		||||
			AND NOT `hidden` AND `uid` = ? AND `network` IN (?, ?, ?, ?)",
 | 
			
		||||
			$uid, Contact::FRIEND, Contact::SHARING, 0, 
 | 
			
		||||
			Protocol::ACTIVITYPUB, Protocol::DFRN, $diaspora, $ostatus],
 | 
			
		||||
			['order' => ['last-item' => true], 'limit' => $totallimit]
 | 
			
		||||
		);
 | 
			
		||||
 | 
			
		||||
		while ($contact = DBA::fetch($results)) {
 | 
			
		||||
			$contacts[$contact['id']] = $contact;
 | 
			
		||||
		}
 | 
			
		||||
		DBA::close($results);
 | 
			
		||||
 | 
			
		||||
		Logger::info('Any contact', ['uid' => $uid, 'cid' => $cid, 'count' => count($contacts)]);
 | 
			
		||||
 | 
			
		||||
		return array_slice($contacts, $start, $limit);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Add public contacts from an array
 | 
			
		||||
	 *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -209,6 +209,110 @@ class Relation
 | 
			
		|||
		return true;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @param int $uid   user
 | 
			
		||||
	 * @param int $start optional, default 0
 | 
			
		||||
	 * @param int $limit optional, default 80
 | 
			
		||||
	 * @return array
 | 
			
		||||
	 */
 | 
			
		||||
	static public function getSuggestions(int $uid, int $start = 0, int $limit = 80)
 | 
			
		||||
	{
 | 
			
		||||
		$cid = Contact::getPublicIdByUserId($uid);
 | 
			
		||||
		$totallimit = $start + $limit;
 | 
			
		||||
		$contacts = [];
 | 
			
		||||
 | 
			
		||||
		Logger::info('Collecting suggestions', ['uid' => $uid, 'cid' => $cid, 'start' => $start, 'limit' => $limit]);
 | 
			
		||||
 | 
			
		||||
		$diaspora = DI::config()->get('system', 'diaspora_enabled') ? Protocol::DIASPORA : Protocol::ACTIVITYPUB;
 | 
			
		||||
		$ostatus = !DI::config()->get('system', 'ostatus_disabled') ? Protocol::OSTATUS : Protocol::ACTIVITYPUB;
 | 
			
		||||
 | 
			
		||||
		// The query returns contacts where contacts interacted with whom the given user follows.
 | 
			
		||||
		// Contacts who already are in the user's contact table are ignored.
 | 
			
		||||
		$results = DBA::select('contact', [],
 | 
			
		||||
			["`id` IN (SELECT `cid` FROM `contact-relation` WHERE `relation-cid` IN
 | 
			
		||||
				(SELECT `cid` FROM `contact-relation` WHERE `relation-cid` = ?)
 | 
			
		||||
					AND NOT `cid` IN (SELECT `id` FROM `contact` WHERE `uid` = ? AND `nurl` IN
 | 
			
		||||
						(SELECT `nurl` FROM `contact` WHERE `uid` = ? AND `rel` IN (?, ?))))
 | 
			
		||||
			AND NOT `hidden` AND `network` IN (?, ?, ?, ?)",
 | 
			
		||||
			$cid, 0, $uid, Contact::FRIEND, Contact::SHARING,
 | 
			
		||||
			Protocol::ACTIVITYPUB, Protocol::DFRN, $diaspora, $ostatus],
 | 
			
		||||
			['order' => ['last-item' => true], 'limit' => $totallimit]
 | 
			
		||||
		);
 | 
			
		||||
 | 
			
		||||
		while ($contact = DBA::fetch($results)) {
 | 
			
		||||
			$contacts[$contact['id']] = $contact;
 | 
			
		||||
		}
 | 
			
		||||
		DBA::close($results);
 | 
			
		||||
 | 
			
		||||
		Logger::info('Contacts of contacts who are followed by the given user', ['uid' => $uid, 'cid' => $cid, 'count' => count($contacts)]);
 | 
			
		||||
 | 
			
		||||
		if (count($contacts) >= $totallimit) {
 | 
			
		||||
			return array_slice($contacts, $start, $limit);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// The query returns contacts where contacts interacted with whom also interacted with the given user.
 | 
			
		||||
		// Contacts who already are in the user's contact table are ignored.
 | 
			
		||||
		$results = DBA::select('contact', [],
 | 
			
		||||
			["`id` IN (SELECT `cid` FROM `contact-relation` WHERE `relation-cid` IN
 | 
			
		||||
				(SELECT `relation-cid` FROM `contact-relation` WHERE `cid` = ?)
 | 
			
		||||
					AND NOT `cid` IN (SELECT `id` FROM `contact` WHERE `uid` = ? AND `nurl` IN
 | 
			
		||||
						(SELECT `nurl` FROM `contact` WHERE `uid` = ? AND `rel` IN (?, ?))))
 | 
			
		||||
			AND NOT `hidden` AND `network` IN (?, ?, ?, ?)",
 | 
			
		||||
			$cid, 0, $uid, Contact::FRIEND, Contact::SHARING,
 | 
			
		||||
			Protocol::ACTIVITYPUB, Protocol::DFRN, $diaspora, $ostatus],
 | 
			
		||||
			['order' => ['last-item' => true], 'limit' => $totallimit]
 | 
			
		||||
		);
 | 
			
		||||
 | 
			
		||||
		while ($contact = DBA::fetch($results)) {
 | 
			
		||||
			$contacts[$contact['id']] = $contact;
 | 
			
		||||
		}
 | 
			
		||||
		DBA::close($results);
 | 
			
		||||
 | 
			
		||||
		Logger::info('Contacts of contacts who are following the given user', ['uid' => $uid, 'cid' => $cid, 'count' => count($contacts)]);
 | 
			
		||||
 | 
			
		||||
		if (count($contacts) >= $totallimit) {
 | 
			
		||||
			return array_slice($contacts, $start, $limit);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// The query returns contacts that follow the given user but aren't followed by that user.
 | 
			
		||||
		$results = DBA::select('contact', [],
 | 
			
		||||
			["`nurl` IN (SELECT `nurl` FROM `contact` WHERE `uid` = ? AND `rel` = ?)
 | 
			
		||||
			AND NOT `hidden` AND `uid` = ? AND `network` IN (?, ?, ?, ?)",
 | 
			
		||||
			$uid, Contact::FOLLOWER, 0, 
 | 
			
		||||
			Protocol::ACTIVITYPUB, Protocol::DFRN, $diaspora, $ostatus],
 | 
			
		||||
			['order' => ['last-item' => true], 'limit' => $totallimit]
 | 
			
		||||
		);
 | 
			
		||||
 | 
			
		||||
		while ($contact = DBA::fetch($results)) {
 | 
			
		||||
			$contacts[$contact['id']] = $contact;
 | 
			
		||||
		}
 | 
			
		||||
		DBA::close($results);
 | 
			
		||||
 | 
			
		||||
		Logger::info('Followers that are not followed by the given user', ['uid' => $uid, 'cid' => $cid, 'count' => count($contacts)]);
 | 
			
		||||
 | 
			
		||||
		if (count($contacts) >= $totallimit) {
 | 
			
		||||
			return array_slice($contacts, $start, $limit);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// The query returns any contact that isn't followed by that user.
 | 
			
		||||
		$results = DBA::select('contact', [],
 | 
			
		||||
			["NOT `nurl` IN (SELECT `nurl` FROM `contact` WHERE `uid` = ? AND `rel` IN (?, ?))
 | 
			
		||||
			AND NOT `hidden` AND `uid` = ? AND `network` IN (?, ?, ?, ?)",
 | 
			
		||||
			$uid, Contact::FRIEND, Contact::SHARING, 0, 
 | 
			
		||||
			Protocol::ACTIVITYPUB, Protocol::DFRN, $diaspora, $ostatus],
 | 
			
		||||
			['order' => ['last-item' => true], 'limit' => $totallimit]
 | 
			
		||||
		);
 | 
			
		||||
 | 
			
		||||
		while ($contact = DBA::fetch($results)) {
 | 
			
		||||
			$contacts[$contact['id']] = $contact;
 | 
			
		||||
		}
 | 
			
		||||
		DBA::close($results);
 | 
			
		||||
 | 
			
		||||
		Logger::info('Any contact', ['uid' => $uid, 'cid' => $cid, 'count' => count($contacts)]);
 | 
			
		||||
 | 
			
		||||
		return array_slice($contacts, $start, $limit);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Counts all the known follows of the provided public contact
 | 
			
		||||
	 *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										204
									
								
								src/Model/Contact/User.php
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										204
									
								
								src/Model/Contact/User.php
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,204 @@
 | 
			
		|||
<?php
 | 
			
		||||
/**
 | 
			
		||||
 * @copyright Copyright (C) 2020, Friendica
 | 
			
		||||
 *
 | 
			
		||||
 * @license GNU AGPL version 3 or any later version
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU Affero General Public License as
 | 
			
		||||
 * published by the Free Software Foundation, either version 3 of the
 | 
			
		||||
 * License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
namespace Friendica\Model\Contact;
 | 
			
		||||
 | 
			
		||||
use Friendica\Database\DBA;
 | 
			
		||||
use Friendica\Model\Contact;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This class provides information about user related contacts based on the "user-contact" table.
 | 
			
		||||
 */
 | 
			
		||||
class User
 | 
			
		||||
{
 | 
			
		||||
	/**
 | 
			
		||||
	 * Block contact id for user id
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param int     $cid     Either public contact id or user's contact id
 | 
			
		||||
	 * @param int     $uid     User ID
 | 
			
		||||
	 * @param boolean $blocked Is the contact blocked or unblocked?
 | 
			
		||||
	 * @throws \Exception
 | 
			
		||||
	 */
 | 
			
		||||
	public static function setBlocked($cid, $uid, $blocked)
 | 
			
		||||
	{
 | 
			
		||||
		$cdata = Contact::getPublicAndUserContacID($cid, $uid);
 | 
			
		||||
		if (empty($cdata)) {
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if ($cdata['user'] != 0) {
 | 
			
		||||
			DBA::update('contact', ['blocked' => $blocked], ['id' => $cdata['user'], 'pending' => false]);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		DBA::update('user-contact', ['blocked' => $blocked], ['cid' => $cdata['public'], 'uid' => $uid], true);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Returns "block" state for contact id and user id
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param int $cid Either public contact id or user's contact id
 | 
			
		||||
	 * @param int $uid User ID
 | 
			
		||||
	 *
 | 
			
		||||
	 * @return boolean is the contact id blocked for the given user?
 | 
			
		||||
	 * @throws \Exception
 | 
			
		||||
	 */
 | 
			
		||||
	public static function isBlocked($cid, $uid)
 | 
			
		||||
	{
 | 
			
		||||
		$cdata = Contact::getPublicAndUserContacID($cid, $uid);
 | 
			
		||||
		if (empty($cdata)) {
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		$public_blocked = false;
 | 
			
		||||
 | 
			
		||||
		if (!empty($cdata['public'])) {
 | 
			
		||||
			$public_contact = DBA::selectFirst('user-contact', ['blocked'], ['cid' => $cdata['public'], 'uid' => $uid]);
 | 
			
		||||
			if (DBA::isResult($public_contact)) {
 | 
			
		||||
				$public_blocked = $public_contact['blocked'];
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		$user_blocked = $public_blocked;
 | 
			
		||||
 | 
			
		||||
		if (!empty($cdata['user'])) {
 | 
			
		||||
			$user_contact = DBA::selectFirst('contact', ['blocked'], ['id' => $cdata['user'], 'pending' => false]);
 | 
			
		||||
			if (DBA::isResult($user_contact)) {
 | 
			
		||||
				$user_blocked = $user_contact['blocked'];
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if ($user_blocked != $public_blocked) {
 | 
			
		||||
			DBA::update('user-contact', ['blocked' => $user_blocked], ['cid' => $cdata['public'], 'uid' => $uid], true);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return $user_blocked;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Ignore contact id for user id
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param int     $cid     Either public contact id or user's contact id
 | 
			
		||||
	 * @param int     $uid     User ID
 | 
			
		||||
	 * @param boolean $ignored Is the contact ignored or unignored?
 | 
			
		||||
	 * @throws \Exception
 | 
			
		||||
	 */
 | 
			
		||||
	public static function setIgnored($cid, $uid, $ignored)
 | 
			
		||||
	{
 | 
			
		||||
		$cdata = Contact::getPublicAndUserContacID($cid, $uid);
 | 
			
		||||
		if (empty($cdata)) {
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if ($cdata['user'] != 0) {
 | 
			
		||||
			DBA::update('contact', ['readonly' => $ignored], ['id' => $cdata['user'], 'pending' => false]);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		DBA::update('user-contact', ['ignored' => $ignored], ['cid' => $cdata['public'], 'uid' => $uid], true);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Returns "ignore" state for contact id and user id
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param int $cid Either public contact id or user's contact id
 | 
			
		||||
	 * @param int $uid User ID
 | 
			
		||||
	 *
 | 
			
		||||
	 * @return boolean is the contact id ignored for the given user?
 | 
			
		||||
	 * @throws \Exception
 | 
			
		||||
	 */
 | 
			
		||||
	public static function isIgnored($cid, $uid)
 | 
			
		||||
	{
 | 
			
		||||
		$cdata = Contact::getPublicAndUserContacID($cid, $uid);
 | 
			
		||||
		if (empty($cdata)) {
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		$public_ignored = false;
 | 
			
		||||
 | 
			
		||||
		if (!empty($cdata['public'])) {
 | 
			
		||||
			$public_contact = DBA::selectFirst('user-contact', ['ignored'], ['cid' => $cdata['public'], 'uid' => $uid]);
 | 
			
		||||
			if (DBA::isResult($public_contact)) {
 | 
			
		||||
				$public_ignored = $public_contact['ignored'];
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		$user_ignored = $public_ignored;
 | 
			
		||||
 | 
			
		||||
		if (!empty($cdata['user'])) {
 | 
			
		||||
			$user_contact = DBA::selectFirst('contact', ['readonly'], ['id' => $cdata['user'], 'pending' => false]);
 | 
			
		||||
			if (DBA::isResult($user_contact)) {
 | 
			
		||||
				$user_ignored = $user_contact['readonly'];
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if ($user_ignored != $public_ignored) {
 | 
			
		||||
			DBA::update('user-contact', ['ignored' => $user_ignored], ['cid' => $cdata['public'], 'uid' => $uid], true);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return $user_ignored;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Set "collapsed" for contact id and user id
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param int     $cid       Either public contact id or user's contact id
 | 
			
		||||
	 * @param int     $uid       User ID
 | 
			
		||||
	 * @param boolean $collapsed are the contact's posts collapsed or uncollapsed?
 | 
			
		||||
	 * @throws \Exception
 | 
			
		||||
	 */
 | 
			
		||||
	public static function setCollapsed($cid, $uid, $collapsed)
 | 
			
		||||
	{
 | 
			
		||||
		$cdata = Contact::getPublicAndUserContacID($cid, $uid);
 | 
			
		||||
		if (empty($cdata)) {
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		DBA::update('user-contact', ['collapsed' => $collapsed], ['cid' => $cdata['public'], 'uid' => $uid], true);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Returns "collapsed" state for contact id and user id
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param int $cid Either public contact id or user's contact id
 | 
			
		||||
	 * @param int $uid User ID
 | 
			
		||||
	 *
 | 
			
		||||
	 * @return boolean is the contact id blocked for the given user?
 | 
			
		||||
	 * @throws HTTPException\InternalServerErrorException
 | 
			
		||||
	 * @throws \ImagickException
 | 
			
		||||
	 */
 | 
			
		||||
	public static function isCollapsed($cid, $uid)
 | 
			
		||||
	{
 | 
			
		||||
		$cdata = Contact::getPublicAndUserContacID($cid, $uid);
 | 
			
		||||
		if (empty($cdata)) {
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		$collapsed = false;
 | 
			
		||||
 | 
			
		||||
		if (!empty($cdata['public'])) {
 | 
			
		||||
			$public_contact = DBA::selectFirst('user-contact', ['collapsed'], ['cid' => $cdata['public'], 'uid' => $uid]);
 | 
			
		||||
			if (DBA::isResult($public_contact)) {
 | 
			
		||||
				$collapsed = $public_contact['collapsed'];
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return $collapsed;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1394,7 +1394,7 @@ class Item
 | 
			
		|||
			return false;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (!empty($item['uid']) && Contact::isBlockedByUser($item['author-id'], $item['uid'])) {
 | 
			
		||||
		if (!empty($item['uid']) && Contact\User::isBlocked($item['author-id'], $item['uid'])) {
 | 
			
		||||
			Logger::notice('Author is blocked by user', ['author-link' => $item['author-link'], 'uid' => $item['uid'], 'item-uri' => $item['uri']]);
 | 
			
		||||
			return false;
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -1409,18 +1409,18 @@ class Item
 | 
			
		|||
			return false;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (!empty($item['uid']) && Contact::isBlockedByUser($item['owner-id'], $item['uid'])) {
 | 
			
		||||
		if (!empty($item['uid']) && Contact\User::isBlocked($item['owner-id'], $item['uid'])) {
 | 
			
		||||
			Logger::notice('Owner is blocked by user', ['owner-link' => $item['owner-link'], 'uid' => $item['uid'], 'item-uri' => $item['uri']]);
 | 
			
		||||
			return false;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// The causer is set during a thread completion, for example because of a reshare. It countains the responsible actor.
 | 
			
		||||
		if (!empty($item['uid']) && !empty($item['causer-id']) && Contact::isBlockedByUser($item['causer-id'], $item['uid'])) {
 | 
			
		||||
		if (!empty($item['uid']) && !empty($item['causer-id']) && Contact\User::isBlocked($item['causer-id'], $item['uid'])) {
 | 
			
		||||
			Logger::notice('Causer is blocked by user', ['causer-link' => $item['causer-link'], 'uid' => $item['uid'], 'item-uri' => $item['uri']]);
 | 
			
		||||
			return false;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (!empty($item['uid']) && !empty($item['causer-id']) && ($item['parent-uri'] == $item['uri']) && Contact::isIgnoredByUser($item['causer-id'], $item['uid'])) {
 | 
			
		||||
		if (!empty($item['uid']) && !empty($item['causer-id']) && ($item['parent-uri'] == $item['uri']) && Contact\User::isIgnored($item['causer-id'], $item['uid'])) {
 | 
			
		||||
			Logger::notice('Causer is ignored by user', ['causer-link' => $item['causer-link'], 'uid' => $item['uid'], 'item-uri' => $item['uri']]);
 | 
			
		||||
			return false;
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -196,8 +196,8 @@ class Contact extends BaseModule
 | 
			
		|||
	 */
 | 
			
		||||
	private static function blockContact($contact_id)
 | 
			
		||||
	{
 | 
			
		||||
		$blocked = !Model\Contact::isBlockedByUser($contact_id, local_user());
 | 
			
		||||
		Model\Contact::setBlockedForUser($contact_id, local_user(), $blocked);
 | 
			
		||||
		$blocked = !Model\Contact\User::isBlocked($contact_id, local_user());
 | 
			
		||||
		Model\Contact\User::setBlocked($contact_id, local_user(), $blocked);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
| 
						 | 
				
			
			@ -208,8 +208,8 @@ class Contact extends BaseModule
 | 
			
		|||
	 */
 | 
			
		||||
	private static function ignoreContact($contact_id)
 | 
			
		||||
	{
 | 
			
		||||
		$ignored = !Model\Contact::isIgnoredByUser($contact_id, local_user());
 | 
			
		||||
		Model\Contact::setIgnoredForUser($contact_id, local_user(), $ignored);
 | 
			
		||||
		$ignored = !Model\Contact\User::isIgnored($contact_id, local_user());
 | 
			
		||||
		Model\Contact\User::setIgnored($contact_id, local_user(), $ignored);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
| 
						 | 
				
			
			@ -395,7 +395,7 @@ class Contact extends BaseModule
 | 
			
		|||
			if ($cmd === 'block') {
 | 
			
		||||
				self::blockContact($contact_id);
 | 
			
		||||
 | 
			
		||||
				$blocked = Model\Contact::isBlockedByUser($contact_id, local_user());
 | 
			
		||||
				$blocked = Model\Contact\User::isBlocked($contact_id, local_user());
 | 
			
		||||
				info(($blocked ? DI::l10n()->t('Contact has been blocked') : DI::l10n()->t('Contact has been unblocked')));
 | 
			
		||||
 | 
			
		||||
				DI::baseUrl()->redirect('contact/' . $contact_id);
 | 
			
		||||
| 
						 | 
				
			
			@ -405,7 +405,7 @@ class Contact extends BaseModule
 | 
			
		|||
			if ($cmd === 'ignore') {
 | 
			
		||||
				self::ignoreContact($contact_id);
 | 
			
		||||
 | 
			
		||||
				$ignored = Model\Contact::isIgnoredByUser($contact_id, local_user());
 | 
			
		||||
				$ignored = Model\Contact\User::isIgnored($contact_id, local_user());
 | 
			
		||||
				info(($ignored ? DI::l10n()->t('Contact has been ignored') : DI::l10n()->t('Contact has been unignored')));
 | 
			
		||||
 | 
			
		||||
				DI::baseUrl()->redirect('contact/' . $contact_id);
 | 
			
		||||
| 
						 | 
				
			
			@ -479,8 +479,8 @@ class Contact extends BaseModule
 | 
			
		|||
				'$baseurl' => DI::baseUrl()->get(true),
 | 
			
		||||
			]);
 | 
			
		||||
 | 
			
		||||
			$contact['blocked']  = Model\Contact::isBlockedByUser($contact['id'], local_user());
 | 
			
		||||
			$contact['readonly'] = Model\Contact::isIgnoredByUser($contact['id'], local_user());
 | 
			
		||||
			$contact['blocked']  = Model\Contact\User::isBlocked($contact['id'], local_user());
 | 
			
		||||
			$contact['readonly'] = Model\Contact\User::isIgnored($contact['id'], local_user());
 | 
			
		||||
 | 
			
		||||
			$relation_text = '';
 | 
			
		||||
			switch ($contact['rel']) {
 | 
			
		||||
| 
						 | 
				
			
			@ -738,8 +738,8 @@ class Contact extends BaseModule
 | 
			
		|||
			$sql_values
 | 
			
		||||
		);
 | 
			
		||||
		while ($contact = DBA::fetch($stmt)) {
 | 
			
		||||
			$contact['blocked'] = Model\Contact::isBlockedByUser($contact['id'], local_user());
 | 
			
		||||
			$contact['readonly'] = Model\Contact::isIgnoredByUser($contact['id'], local_user());
 | 
			
		||||
			$contact['blocked'] = Model\Contact\User::isBlocked($contact['id'], local_user());
 | 
			
		||||
			$contact['readonly'] = Model\Contact\User::isIgnored($contact['id'], local_user());
 | 
			
		||||
			$contacts[] = self::getContactTemplateVars($contact);
 | 
			
		||||
		}
 | 
			
		||||
		DBA::close($stmt);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -376,8 +376,8 @@ function update_1327()
 | 
			
		|||
{
 | 
			
		||||
	$contacts = DBA::select('contact', ['uid', 'id', 'blocked', 'readonly'], ["`uid` != ? AND (`blocked` OR `readonly`) AND NOT `pending`", 0]);
 | 
			
		||||
	while ($contact = DBA::fetch($contacts)) {
 | 
			
		||||
		Contact::setBlockedForUser($contact['id'], $contact['uid'], $contact['blocked']);
 | 
			
		||||
		Contact::setIgnoredForUser($contact['id'], $contact['uid'], $contact['readonly']);
 | 
			
		||||
		Contact\User::setBlocked($contact['id'], $contact['uid'], $contact['blocked']);
 | 
			
		||||
		Contact\User::setIgnored($contact['id'], $contact['uid'], $contact['readonly']);
 | 
			
		||||
	}
 | 
			
		||||
	DBA::close($contacts);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -117,7 +117,7 @@ function vier_community_info()
 | 
			
		|||
 | 
			
		||||
	// comunity_profiles
 | 
			
		||||
	if ($show_profiles) {
 | 
			
		||||
		$contacts = Contact::getSuggestions(local_user(), 0, 9);
 | 
			
		||||
		$contacts = Contact\Relation::getSuggestions(local_user(), 0, 9);
 | 
			
		||||
 | 
			
		||||
		$tpl = Renderer::getMarkupTemplate('ch_directory_item.tpl');
 | 
			
		||||
		if (DBA::isResult($contacts)) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue