<?php
/**
- * @copyright Copyright (C) 2020, Friendica
+ * @copyright Copyright (C) 2010-2021, the Friendica project
*
* @license GNU AGPL version 3 or any later version
*
$condition = ['`alias` IN (?, ?, ?) AND `uid` = ? AND NOT `deleted`', $url, Strings::normaliseLink($url), $ssl_url, $uid];
$contact = DBA::selectFirst('contact', $fields, $condition, $options);
}
-
+
if (!DBA::isResult($contact)) {
return [];
}
}
$contact = self::getByURL($url, $update, $fields);
- if (!empty($contact['id'])) {
+ if (!empty($contact['id'])) {
$contact['cid'] = 0;
$contact['zid'] = $contact['id'];
}
return true;
}
- $user = DBA::selectFirst('user', ['uid', 'username', 'nickname', 'pubkey', 'prvkey'], ['uid' => $uid]);
+ $user = DBA::selectFirst('user', ['uid', 'username', 'nickname', 'pubkey', 'prvkey'],
+ ['uid' => $uid, 'account_expired' => false]);
if (!DBA::isResult($user)) {
return false;
}
}
$fields = ['nickname', 'page-flags', 'account-type', 'prvkey', 'pubkey'];
- $user = DBA::selectFirst('user', $fields, ['uid' => $uid]);
+ $user = DBA::selectFirst('user', $fields, ['uid' => $uid, 'account_expired' => false]);
if (!DBA::isResult($user)) {
return;
}
if (!empty($contact['batch']) && !empty($contact['term-date']) && ($contact['term-date'] > DBA::NULL_DATETIME)) {
$fields = ['failed' => false, 'term-date' => DBA::NULL_DATETIME, 'archive' => false];
$condition = ['uid' => 0, 'network' => Protocol::FEDERATED, 'batch' => $contact['batch'], 'contact-type' => self::TYPE_RELAY];
- DBA::update('contact', $fields, $condition);
+ if (!DBA::exists('contact', array_merge($condition, $fields))) {
+ DBA::update('contact', $fields, $condition);
+ }
}
$condition = ['`id` = ? AND (`term-date` > ? OR `archive`)', $contact['id'], DBA::NULL_DATETIME];
*
* @param string $contact_url Contact URL
* @param bool $thread_mode
- * @param int $update Update mode
+ * @param int $update Update mode
* @param int $parent Item parent ID for the update mode
* @return string posts in HTML
* @throws \Exception
*
* @param int $cid Contact ID
* @param bool $thread_mode
- * @param int $update Update mode
+ * @param int $update Update mode
* @param int $parent Item parent ID for the update mode
* @return string posts in HTML
* @throws \Exception
$o = '';
}
- if ($thread_mode) {
+ if ($thread_mode) {
$items = Post::toArray(Post::selectForUser(local_user(), ['uri-id', 'gravity', 'parent-uri-id', 'thr-parent-id', 'author-id'], $condition, $params));
$o .= conversation($a, $items, 'contacts', $update, false, 'commented', local_user());
/**
* Return the photo path for a given contact array in the given size
*
- * @param array $contact contact array
- * @param string $field Fieldname of the photo in the contact array
- * @param string $size Size of the avatar picture
- * @param string $avatar Avatar path that is displayed when no photo had been found
+ * @param array $contact contact array
+ * @param string $field Fieldname of the photo in the contact array
+ * @param string $size Size of the avatar picture
+ * @param string $avatar Avatar path that is displayed when no photo had been found
+ * @param bool $no_update Don't perfom an update if no cached avatar was found
* @return string photo path
*/
- private static function getAvatarPath(array $contact, string $field, string $size, string $avatar)
+ private static function getAvatarPath(array $contact, string $field, string $size, string $avatar, $no_update = false)
{
if (!empty($contact)) {
- $contact = self::checkAvatarCacheByArray($contact);
+ $contact = self::checkAvatarCacheByArray($contact, $no_update);
if (!empty($contact[$field])) {
$avatar = $contact[$field];
}
}
+ if ($no_update && empty($avatar) && !empty($contact['avatar'])) {
+ $avatar = $contact['avatar'];
+ }
+
if (empty($avatar)) {
$avatar = self::getDefaultAvatar([], $size);
}
/**
* Return the photo path for a given contact array
*
- * @param array $contact Contact array
- * @param string $avatar Avatar path that is displayed when no photo had been found
+ * @param array $contact Contact array
+ * @param string $avatar Avatar path that is displayed when no photo had been found
+ * @param bool $no_update Don't perfom an update if no cached avatar was found
* @return string photo path
*/
- public static function getPhoto(array $contact, string $avatar = '')
+ public static function getPhoto(array $contact, string $avatar = '', bool $no_update = false)
{
- return self::getAvatarPath($contact, 'photo', Proxy::SIZE_SMALL, $avatar);
+ return self::getAvatarPath($contact, 'photo', Proxy::SIZE_SMALL, $avatar, $no_update);
}
/**
* Return the photo path (thumb size) for a given contact array
*
- * @param array $contact Contact array
- * @param string $avatar Avatar path that is displayed when no photo had been found
+ * @param array $contact Contact array
+ * @param string $avatar Avatar path that is displayed when no photo had been found
+ * @param bool $no_update Don't perfom an update if no cached avatar was found
* @return string photo path
*/
- public static function getThumb(array $contact, string $avatar = '')
+ public static function getThumb(array $contact, string $avatar = '', bool $no_update = false)
{
- return self::getAvatarPath($contact, 'thumb', Proxy::SIZE_THUMB, $avatar);
+ return self::getAvatarPath($contact, 'thumb', Proxy::SIZE_THUMB, $avatar, $no_update);
}
/**
* Return the photo path (micro size) for a given contact array
*
- * @param array $contact Contact array
- * @param string $avatar Avatar path that is displayed when no photo had been found
+ * @param array $contact Contact array
+ * @param string $avatar Avatar path that is displayed when no photo had been found
+ * @param bool $no_update Don't perfom an update if no cached avatar was found
* @return string photo path
*/
- public static function getMicro(array $contact, string $avatar = '')
+ public static function getMicro(array $contact, string $avatar = '', bool $no_update = false)
{
- return self::getAvatarPath($contact, 'micro', Proxy::SIZE_MICRO, $avatar);
+ return self::getAvatarPath($contact, 'micro', Proxy::SIZE_MICRO, $avatar, $no_update);
}
/**
* Check the given contact array for avatar cache fields
*
* @param array $contact
+ * @param bool $no_update Don't perfom an update if no cached avatar was found
* @return array contact array with avatar cache fields
*/
- private static function checkAvatarCacheByArray(array $contact)
+ private static function checkAvatarCacheByArray(array $contact, bool $no_update = false)
{
$update = false;
$contact_fields = [];
}
}
- if (!$update) {
+ if (!$update || $no_update) {
return $contact;
}
$avatar['size'] = 48;
$default = self::DEFAULT_AVATAR_MICRO;
break;
-
+
case Proxy::SIZE_THUMB:
$avatar['size'] = 80;
$default = self::DEFAULT_AVATAR_THUMB;
break;
-
+
case Proxy::SIZE_SMALL:
default:
$avatar['size'] = 300;
$contact['thumb'] ?? '',
$contact['micro'] ?? '',
];
-
+
foreach ($data as $image_uri) {
$image_rid = Photo::ridFromURI($image_uri);
if ($image_rid && !Photo::exists(['resource-id' => $image_rid, 'uid' => $uid])) {
if (Contact\Relation::isDiscoverable($ret['url'])) {
Worker::add(PRIORITY_LOW, 'ContactDiscovery', $ret['url']);
}
-
+
// Update the public contact
if ($uid != 0) {
$contact = self::getByURL($ret['url'], false, ['id']);
return $contact;
}
+ /**
+ * Follow a contact
+ *
+ * @param int $cid Public contact id
+ * @param int $uid User ID
+ *
+ * @return bool "true" if following had been successful
+ */
+ public static function follow(int $cid, int $uid)
+ {
+ $user = User::getById($uid);
+ if (empty($user)) {
+ return false;
+ }
+
+ $contact = self::getById($cid, ['url']);
+
+ $result = self::createFromProbe($user, $contact['url'], false);
+
+ return $result['cid'];
+ }
+
+ /**
+ * Unfollow a contact
+ *
+ * @param int $cid Public contact id
+ * @param int $uid User ID
+ *
+ * @return bool "true" if unfollowing had been successful
+ */
+ public static function unfollow(int $cid, int $uid)
+ {
+ $cdata = self::getPublicAndUserContacID($cid, $uid);
+ if (empty($cdata['user'])) {
+ return false;
+ }
+
+ $contact = self::getById($cdata['user']);
+
+ self::removeSharer([], $contact);
+
+ return true;
+ }
+
/**
* @param array $importer Owner (local user) data
* @param array $contact Existing owner-specific contact data we want to expand the relationship with. Optional.
return null;
}
- public static function removeFollower($importer, $contact, array $datarray = [], $item = "")
+ public static function removeFollower($importer, $contact)
{
if (($contact['rel'] == self::FRIEND) || ($contact['rel'] == self::SHARING)) {
DBA::update('contact', ['rel' => self::SHARING], ['id' => $contact['id']]);
}
}
- public static function removeSharer($importer, $contact, array $datarray = [], $item = "")
+ public static function removeSharer($importer, $contact)
{
if (($contact['rel'] == self::FRIEND) || ($contact['rel'] == self::FOLLOWER)) {
DBA::update('contact', ['rel' => self::FOLLOWER], ['id' => $contact['id']]);
public static function updateBirthdays()
{
$condition = [
- '`bd` != ""
- AND `bd` > "0001-01-01"
- AND SUBSTRING(`bd`, 1, 4) != `bdyear`
+ '`bd` > ?
AND (`contact`.`rel` = ? OR `contact`.`rel` = ?)
AND NOT `contact`.`pending`
AND NOT `contact`.`hidden`
AND NOT `contact`.`blocked`
AND NOT `contact`.`archive`
AND NOT `contact`.`deleted`',
+ DBA::NULL_DATE,
self::SHARING,
self::FRIEND
];
*
* @param string $search Name or nick
* @param string $mode Search mode (e.g. "community")
+ * @param int $uid User ID
*
* @return array with search results
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
- public static function searchByName($search, $mode = '')
+ public static function searchByName(string $search, string $mode = '', int $uid = 0)
{
if (empty($search)) {
return [];
NOT `failed` AND `uid` = ? AND
(`addr` LIKE ? OR `name` LIKE ? OR `nick` LIKE ?) $extra_sql
ORDER BY `nurl` DESC LIMIT 1000",
- Protocol::DFRN, Protocol::ACTIVITYPUB, $ostatus, $diaspora, 0, $search, $search, $search
+ Protocol::DFRN, Protocol::ACTIVITYPUB, $ostatus, $diaspora, $uid, $search, $search, $search
);
$contacts = DBA::toArray($results);
$count = 0;
foreach ($urls as $url) {
+ if (empty($url) || !is_string($url)) {
+ continue;
+ }
$contact = self::getByURL($url, false, ['id', 'updated']);
if (empty($contact['id'])) {
Worker::add(PRIORITY_LOW, 'AddContact', 0, $url);