*/
public static function checkAvatarCache(int $cid)
{
- $contact = DBA::selectFirst('contact', ['url', 'avatar', 'photo', 'thumb', 'micro'], ['id' => $cid, 'uid' => 0, 'self' => false]);
+ $contact = DBA::selectFirst('contact', ['url', 'network', 'avatar', 'photo', 'thumb', 'micro'], ['id' => $cid, 'uid' => 0, 'self' => false]);
if (!DBA::isResult($contact)) {
return;
}
- if (empty($contact['avatar']) || (!empty($contact['photo']) && !empty($contact['thumb']) && !empty($contact['micro']))) {
+ if (in_array($contact['network'], [Protocol::FEED, Protocol::MAIL]) || DI::config()->get('system', 'cache_contact_avatar')) {
+ if (!empty($contact['avatar']) && (empty($contact['photo']) || empty($contact['thumb']) || empty($contact['micro']))) {
+ Logger::info('Adding avatar cache', ['id' => $cid, 'contact' => $contact]);
+ self::updateAvatar($cid, $contact['avatar'], true);
+ return;
+ }
+ } elseif (!empty($contact['photo']) || !empty($contact['thumb']) || !empty($contact['micro'])) {
+ Logger::info('Removing avatar cache', ['id' => $cid, 'contact' => $contact]);
+ self::updateAvatar($cid, $contact['avatar'], true);
return;
}
-
- Logger::info('Adding avatar cache', ['id' => $cid, 'contact' => $contact]);
-
- self::updateAvatar($cid, $contact['avatar'], true);
}
/**
$avatar = self::getDefaultAvatar($contact, Proxy::SIZE_SMALL);
}
- if ($default_avatar && Proxy::isLocalImage($avatar)) {
- $fields = ['avatar' => $avatar, 'avatar-date' => DateTimeFormat::utcNow(),
- 'photo' => $avatar,
- 'thumb' => self::getDefaultAvatar($contact, Proxy::SIZE_THUMB),
- 'micro' => self::getDefaultAvatar($contact, Proxy::SIZE_MICRO)];
- Logger::debug('Use default avatar', ['id' => $cid, 'uid' => $uid]);
- }
+ if (in_array($contact['network'], [Protocol::FEED, Protocol::MAIL]) || DI::config()->get('system', 'cache_contact_avatar')) {
+ if ($default_avatar && Proxy::isLocalImage($avatar)) {
+ $fields = ['avatar' => $avatar, 'avatar-date' => DateTimeFormat::utcNow(),
+ 'photo' => $avatar,
+ 'thumb' => self::getDefaultAvatar($contact, Proxy::SIZE_THUMB),
+ 'micro' => self::getDefaultAvatar($contact, Proxy::SIZE_MICRO)];
+ Logger::debug('Use default avatar', ['id' => $cid, 'uid' => $uid]);
+ }
- // Use the data from the self account
- if (empty($fields)) {
- $local_uid = User::getIdForURL($contact['url']);
- if (!empty($local_uid)) {
- $fields = self::selectFirst(['avatar', 'avatar-date', 'photo', 'thumb', 'micro'], ['self' => true, 'uid' => $local_uid]);
- Logger::debug('Use owner data', ['id' => $cid, 'uid' => $uid, 'owner-uid' => $local_uid]);
+ // Use the data from the self account
+ if (empty($fields)) {
+ $local_uid = User::getIdForURL($contact['url']);
+ if (!empty($local_uid)) {
+ $fields = self::selectFirst(['avatar', 'avatar-date', 'photo', 'thumb', 'micro'], ['self' => true, 'uid' => $local_uid]);
+ Logger::debug('Use owner data', ['id' => $cid, 'uid' => $uid, 'owner-uid' => $local_uid]);
+ }
}
- }
- if (empty($fields)) {
- $update = ($contact['avatar'] != $avatar) || $force;
-
- if (!$update) {
- $data = [
- $contact['photo'] ?? '',
- $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])) {
- Logger::debug('Regenerating avatar', ['contact uid' => $uid, 'cid' => $cid, 'missing photo' => $image_rid, 'avatar' => $contact['avatar']]);
- $update = true;
+ if (empty($fields)) {
+ $update = ($contact['avatar'] != $avatar) || $force;
+
+ if (!$update) {
+ $data = [
+ $contact['photo'] ?? '',
+ $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])) {
+ Logger::debug('Regenerating avatar', ['contact uid' => $uid, 'cid' => $cid, 'missing photo' => $image_rid, 'avatar' => $contact['avatar']]);
+ $update = true;
+ }
}
}
- }
- if ($update) {
- $photos = Photo::importProfilePhoto($avatar, $uid, $cid, true);
- if ($photos) {
- $fields = ['avatar' => $avatar, 'photo' => $photos[0], 'thumb' => $photos[1], 'micro' => $photos[2], 'avatar-date' => DateTimeFormat::utcNow()];
- $update = !empty($fields);
- Logger::debug('Created new cached avatars', ['id' => $cid, 'uid' => $uid, 'owner-uid' => $local_uid]);
- } else {
- $update = false;
+ if ($update) {
+ $photos = Photo::importProfilePhoto($avatar, $uid, $cid, true);
+ if ($photos) {
+ $fields = ['avatar' => $avatar, 'photo' => $photos[0], 'thumb' => $photos[1], 'micro' => $photos[2], 'avatar-date' => DateTimeFormat::utcNow()];
+ $update = !empty($fields);
+ Logger::debug('Created new cached avatars', ['id' => $cid, 'uid' => $uid, 'owner-uid' => $local_uid]);
+ } else {
+ $update = false;
+ }
}
+ } else {
+ $update = ($fields['photo'] . $fields['thumb'] . $fields['micro'] != $contact['photo'] . $contact['thumb'] . $contact['micro']) || $force;
}
} else {
- $update = ($fields['photo'] . $fields['thumb'] . $fields['micro'] != $contact['photo'] . $contact['thumb'] . $contact['micro']) || $force;
+ Photo::delete(['uid' => $uid, 'contact-id' => $cid, 'photo-type' => Photo::CONTACT_AVATAR]);
+ $fields = ['avatar' => $avatar, 'avatar-date' => DateTimeFormat::utcNow(),
+ 'photo' => '', 'thumb' => '', 'micro' => ''];
+ $update = ($avatar != $contact['avatar'] . $contact['photo'] . $contact['thumb'] . $contact['micro']) || $force;
}
if (!$update) {
$allow_users_remote_self = !empty($_POST['allow_users_remote_self']);
$explicit_content = !empty($_POST['explicit_content']);
$proxify_content = !empty($_POST['proxify_content']);
+ $cache_contact_avatar = !empty($_POST['cache_contact_avatar']);
$enable_multi_reg = !empty($_POST['enable_multi_reg']);
$enable_openid = !empty($_POST['enable_openid']);
DI::config()->set('system', 'allow_users_remote_self', $allow_users_remote_self);
DI::config()->set('system', 'explicit_content' , $explicit_content);
DI::config()->set('system', 'proxify_content' , $proxify_content);
+ DI::config()->set('system', 'cache_contact_avatar' , $cache_contact_avatar);
DI::config()->set('system', 'check_new_version_url' , $check_new_version_url);
DI::config()->set('system', 'block_extended_register', !$enable_multi_reg);
'$disable_embedded' => ['disable_embedded', DI::l10n()->t('Don\'t embed private images in posts'), DI::config()->get('system', 'disable_embedded'), DI::l10n()->t('Don\'t replace locally-hosted private photos in posts with an embedded copy of the image. This means that contacts who receive posts containing private photos will have to authenticate and load each image, which may take a while.')],
'$explicit_content' => ['explicit_content', DI::l10n()->t('Explicit Content'), DI::config()->get('system', 'explicit_content'), DI::l10n()->t('Set this to announce that your node is used mostly for explicit content that might not be suited for minors. This information will be published in the node information and might be used, e.g. by the global directory, to filter your node from listings of nodes to join. Additionally a note about this will be shown at the user registration page.')],
'$proxify_content' => ['proxify_content', DI::l10n()->t('Proxify external content'), DI::config()->get('system', 'proxify_content'), DI::l10n()->t('Route external content via the proxy functionality. This is used for example for some OEmbed accesses and in some other rare cases.')],
+ '$cache_contact_avatar' => ['cache_contact_avatar', DI::l10n()->t('Cache contact avatars'), DI::config()->get('system', 'cache_contact_avatar'), DI::l10n()->t('Locally store the avatar pictures of the contacts. This uses a lot of storage space but it increases the performance.')],
'$allow_users_remote_self'=> ['allow_users_remote_self', DI::l10n()->t('Allow Users to set remote_self'), DI::config()->get('system', 'allow_users_remote_self'), DI::l10n()->t('With checking this, every user is allowed to mark every contact as a remote_self in the repair contact dialog. Setting this flag on a contact causes mirroring every posting of that contact in the users stream.')],
'$enable_multi_reg' => ['enable_multi_reg', DI::l10n()->t('Enable multiple registrations'), !DI::config()->get('system', 'block_extended_register'), DI::l10n()->t('Enable users to register additional accounts for use as pages.')],
'$enable_openid' => ['enable_openid', DI::l10n()->t('Enable OpenID'), !DI::config()->get('system', 'no_openid'), DI::l10n()->t('Enable OpenID support for registration and logins.')],