Use caching and a fetch queue to fetch avatars slowly without overloading server #115

This commit is contained in:
the-djmaze 2022-11-23 10:22:49 +01:00
parent 5069bc2950
commit 0deedbecf5
3 changed files with 122 additions and 44 deletions

View file

@ -58,20 +58,38 @@ class AvatarsPlugin extends \RainLoop\Plugins\AbstractPlugin
$aResult = null;
// TODO: lookup contacts vCard
$oAccount = $oActions->getAccountFromToken();
if ($oAccount) {
$oAddressBookProvider = $oActions->AddressBookProvider($oAccount);
if ($oAddressBookProvider) {
$oContact = $oAddressBookProvider->GetContactByEmail($sEmail);
if ($oContact && $oContact->vCard && $oContact->vCard['PHOTO']) {
$aResult = [
'text/vcard',
$oContact->vCard
];
$sAsciiEmail = \MailSo\Base\Utils::IdnToAscii($sEmail, true);
$sEmailId = \sha1(\strtolower($sAsciiEmail));
$sFile = \APP_PRIVATE_DATA . 'avatars/' . $sEmailId;
$aFiles = \glob("{$sFile}.*");
if ($aFiles) {
$aResult = [
\mime_content_type($aFiles[0]),
\file_get_contents($aFiles[0])
];
$oActions->cacheByKey($sEmail);
return $aResult;
}
// TODO: lookup contacts vCard and return PHOTO value
/*
if (!$aResult) {
$oAccount = $oActions->getAccountFromToken();
if ($oAccount) {
$oAddressBookProvider = $oActions->AddressBookProvider($oAccount);
if ($oAddressBookProvider) {
$oContact = $oAddressBookProvider->GetContactByEmail($sEmail);
if ($oContact && $oContact->vCard && $oContact->vCard['PHOTO']) {
$aResult = [
'text/vcard',
$oContact->vCard
];
}
}
}
}
*/
if (!$aResult) {
$sDomain = \explode('@', $sEmail);
@ -89,7 +107,6 @@ class AvatarsPlugin extends \RainLoop\Plugins\AbstractPlugin
}
// TODO: make Gravatar optional
$sAsciiEmail = \MailSo\Base\Utils::IdnToAscii($sEmail, true);
$aUrls[] = 'http://gravatar.com/avatar/'.\md5(\strtolower($sAsciiEmail)).'?s=80&d=404';
foreach ($aUrls as $sUrl) {
@ -99,6 +116,16 @@ class AvatarsPlugin extends \RainLoop\Plugins\AbstractPlugin
}
}
if ($aResult) {
if (!\is_dir(\APP_PRIVATE_DATA . 'avatars')) {
\mkdir(\APP_PRIVATE_DATA . 'avatars', 0700);
}
\file_put_contents(
$sFile . \SnappyMail\File\MimeType::toExtension($aResult[0]),
$aResult[1]
);
}
if (!$aResult) {
$aServices = [
"services/{$sDomain}",