// Update the contact in the background if needed
$updated = max($contact['success_update'], $contact['created'], $contact['updated'], $contact['last-update'], $contact['failure_update']);
- if (($updated < DateTimeFormat::utc('now -7 days')) && in_array($contact['network'], Protocol::FEDERATED)) {
+ if (($updated < DateTimeFormat::utc('now -7 days')) && in_array($contact['network'], Protocol::FEDERATED) && !self::isLocalById($contact['id'])) {
Worker::add(PRIORITY_LOW, "UpdateContact", $contact['id']);
}
*/
public static function createSelfFromUserId($uid)
{
- // Only create the entry if it doesn't exist yet
- if (DBA::exists('contact', ['uid' => $uid, 'self' => true])) {
- return true;
- }
-
$user = DBA::selectFirst('user', ['uid', 'username', 'nickname', 'pubkey', 'prvkey'],
['uid' => $uid, 'account_expired' => false]);
if (!DBA::isResult($user)) {
return false;
}
- $return = DBA::insert('contact', [
+ $contact = [
'uid' => $user['uid'],
'created' => DateTimeFormat::utcNow(),
'self' => 1,
'uri-date' => DateTimeFormat::utcNow(),
'avatar-date' => DateTimeFormat::utcNow(),
'closeness' => 0
- ]);
+ ];
+
+ $return = true;
+
+ // Only create the entry if it doesn't exist yet
+ if (!DBA::exists('contact', ['uid' => $uid, 'self' => true])) {
+ $return = DBA::insert('contact', $contact);
+ }
+
+ // Create the public contact
+ if (!DBA::exists('contact', ['nurl' => $contact['nurl'], 'uid' => 0])) {
+ $contact['self'] = false;
+ $contact['uid'] = 0;
+ $contact['prvkey'] = null;
+
+ DBA::insert('contact', $contact, Database::INSERT_IGNORE);
+ }
return $return;
}
*
* @param int $uid
* @param boolean $update_avatar Force the avatar update
+ * @return bool "true" if updated
* @throws HTTPException\InternalServerErrorException
*/
public static function updateSelfFromUserID($uid, $update_avatar = false)
'photo', 'thumb', 'micro', 'addr', 'request', 'notify', 'poll', 'confirm', 'poco'];
$self = DBA::selectFirst('contact', $fields, ['uid' => $uid, 'self' => true]);
if (!DBA::isResult($self)) {
- return;
+ return false;
}
$fields = ['nickname', 'page-flags', 'account-type', 'prvkey', 'pubkey'];
$user = DBA::selectFirst('user', $fields, ['uid' => $uid, 'account_expired' => false]);
if (!DBA::isResult($user)) {
- return;
+ return false;
}
$fields = ['name', 'photo', 'thumb', 'about', 'address', 'locality', 'region',
'country-name', 'pub_keywords', 'xmpp', 'net-publish'];
$profile = DBA::selectFirst('profile', $fields, ['uid' => $uid]);
if (!DBA::isResult($profile)) {
- return;
+ return false;
}
$file_suffix = 'jpg';
DBA::update('contact', $fields, ['id' => $self['id']]);
// Update the public contact as well
+ $fields['prvkey'] = null;
+ $fields['self'] = false;
DBA::update('contact', $fields, ['uid' => 0, 'nurl' => $self['nurl']]);
// Update the profile
'thumb' => DI::baseUrl() . '/photo/avatar/' . $uid .'.' . $file_suffix];
DBA::update('profile', $fields, ['uid' => $uid]);
}
+
+ return $update;
}
/**
if (($uid == 0) && (empty($data['network']) || ($data['network'] == Protocol::PHANTOM))) {
// Fetch data for the public contact via the first found personal contact
/// @todo Check if this case can happen at all (possibly with mail accounts?)
- $fields = ['name', 'nick', 'url', 'addr', 'alias', 'avatar', 'contact-type',
+ $fields = ['name', 'nick', 'url', 'addr', 'alias', 'avatar', 'header', 'contact-type',
'keywords', 'location', 'about', 'unsearchable', 'batch', 'notify', 'poll',
'request', 'confirm', 'poco', 'subscribe', 'network', 'baseurl', 'gsid'];
if (!empty($contact)) {
$contact = self::checkAvatarCacheByArray($contact, $no_update);
if (!empty($contact[$field])) {
- $avatar = $contact[$field];
+ return $contact[$field];
+ } elseif (!empty($contact['id'])) {
+ return self::getAvatarUrlForId($contact['id'], $size, $contact['updated'] ?? '');
+ } elseif (!empty($contact['avatar'])) {
+ $avatar = $contact['avatar'];
}
}
- if ($no_update && empty($avatar) && !empty($contact['avatar'])) {
- $avatar = $contact['avatar'];
- }
-
if (empty($avatar)) {
$avatar = self::getDefaultAvatar([], $size);
}
*
* @param array $contact contact array
* @param string $size Size of the avatar picture
- * @return void
+ * @return string avatar URL
*/
public static function getDefaultAvatar(array $contact, string $size)
{
return DI::baseUrl() . $default;
}
+ /**
+ * Get avatar link for given contact id
+ *
+ * @param integer $cid contact id
+ * @param string $size One of the ProxyUtils::SIZE_* constants
+ * @param string $updated Contact update date
+ * @return string avatar link
+ */
+ public static function getAvatarUrlForId(int $cid, string $size = '', string $updated = ''):string
+ {
+ // We have to fetch the "updated" variable when it wasn't provided
+ // The parameter can be provided to improve performance
+ if (empty($updated)) {
+ $contact = self::getById($cid, ['updated']);
+ $updated = $contact['updated'] ?? '';
+ }
+
+ $url = DI::baseUrl() . '/photo/contact/';
+ switch ($size) {
+ case Proxy::SIZE_MICRO:
+ $url .= Proxy::PIXEL_MICRO . '/';
+ break;
+ case Proxy::SIZE_THUMB:
+ $url .= Proxy::PIXEL_THUMB . '/';
+ break;
+ case Proxy::SIZE_SMALL:
+ $url .= Proxy::PIXEL_SMALL . '/';
+ break;
+ case Proxy::SIZE_MEDIUM:
+ $url .= Proxy::PIXEL_MEDIUM . '/';
+ break;
+ case Proxy::SIZE_LARGE:
+ $url .= Proxy::PIXEL_LARGE . '/';
+ break;
+ }
+ return $url . $cid . ($updated ? '?ts=' . strtotime($updated) : '');
+ }
+
+ /**
+ * Get avatar link for given contact URL
+ *
+ * @param string $url contact url
+ * @param integer $uid user id
+ * @param string $size One of the ProxyUtils::SIZE_* constants
+ * @return string avatar link
+ */
+ public static function getAvatarUrlForUrl(string $url, int $uid, string $size = ''):string
+ {
+ $condition = ["`nurl` = ? AND ((`uid` = ? AND `network` IN (?, ?)) OR `uid` = ?)",
+ Strings::normaliseLink($url), $uid, Protocol::FEED, Protocol::MAIL, 0];
+ $contact = self::selectFirst(['id', 'updated'], $condition);
+ return self::getAvatarUrlForId($contact['id'] ?? 0, $size, $contact['updated']);
+ }
+
+ /**
+ * Get header link for given contact id
+ *
+ * @param integer $cid contact id
+ * @param string $size One of the ProxyUtils::SIZE_* constants
+ * @param string $updated Contact update date
+ * @return string header link
+ */
+ public static function getHeaderUrlForId(int $cid, string $size = '', string $updated = ''):string
+ {
+ // We have to fetch the "updated" variable when it wasn't provided
+ // The parameter can be provided to improve performance
+ if (empty($updated)) {
+ $contact = self::getById($cid, ['updated']);
+ $updated = $contact['updated'] ?? '';
+ }
+
+ $url = DI::baseUrl() . '/photo/header/';
+ switch ($size) {
+ case Proxy::SIZE_MICRO:
+ $url .= Proxy::PIXEL_MICRO . '/';
+ break;
+ case Proxy::SIZE_THUMB:
+ $url .= Proxy::PIXEL_THUMB . '/';
+ break;
+ case Proxy::SIZE_SMALL:
+ $url .= Proxy::PIXEL_SMALL . '/';
+ break;
+ case Proxy::SIZE_MEDIUM:
+ $url .= Proxy::PIXEL_MEDIUM . '/';
+ break;
+ case Proxy::SIZE_LARGE:
+ $url .= Proxy::PIXEL_LARGE . '/';
+ break;
+ }
+
+ return $url . $cid . ($updated ? '?ts=' . strtotime($updated) : '');
+ }
+
/**
* Updates the avatar links in a contact only if needed
*
// These fields aren't updated by this routine:
// 'xmpp', 'sensitive'
- $fields = ['uid', 'avatar', 'name', 'nick', 'location', 'keywords', 'about', 'subscribe', 'manually-approve',
- 'unsearchable', 'url', 'addr', 'batch', 'notify', 'poll', 'request', 'confirm', 'poco',
+ $fields = ['uid', 'avatar', 'header', 'name', 'nick', 'location', 'keywords', 'about', 'subscribe',
+ 'manually-approve', 'unsearchable', 'url', 'addr', 'batch', 'notify', 'poll', 'request', 'confirm', 'poco',
'network', 'alias', 'baseurl', 'gsid', 'forum', 'prv', 'contact-type', 'pubkey', 'last-item'];
$contact = DBA::selectFirst('contact', $fields, ['id' => $id]);
if (!DBA::isResult($contact)) {
// Ensure to always have the correct network type, independent from the connection request method
self::updateFromProbe($contact['id']);
+ Post\UserNotification::insertNotication($contact['id'], Verb::getID(Activity::FOLLOW), $importer['uid']);
+
return true;
} else {
// send email notification to owner?
self::updateAvatar($contact_id, $photo, true);
+ Post\UserNotification::insertNotication($contact_id, Verb::getID(Activity::FOLLOW), $importer['uid']);
+
$contact_record = DBA::selectFirst('contact', ['id', 'network', 'name', 'url', 'photo'], ['id' => $contact_id]);
/// @TODO Encapsulate this into a function/method