Make new avatar logic more robust

This commit is contained in:
Matias Griese 2022-03-08 19:15:46 +02:00
parent 499b25aad8
commit e0deeeb551

View File

@ -16,7 +16,8 @@ use Grav\Common\Page\Medium\Medium;
use Grav\Common\Page\Medium\StaticImageMedium;
use Grav\Common\User\Authentication;
use Grav\Common\Utils;
use Gregwar\Image\Image;
use Multiavatar;
use RocketTheme\Toolbox\ResourceLocator\UniformResourceLocator;
use function is_array;
use function is_string;
@ -176,40 +177,50 @@ trait UserTrait
}
}
$avatar_url = '';
$email = $this->get('email');
$hashcode = $this->get('avatar_hash');
$avatar_generator = Grav::instance()['config']->get('system.accounts.avatar', 'multiavatar');
if ($hashcode || $email) {
$hash = $hashcode ?: md5(strtolower(trim($email)));
switch ($avatar_generator) {
case 'gravatar':
$avatar_url = 'https://www.gravatar.com/avatar/' . $hash;
break;
default:
return $this->generateMultiavatar($hash);
if ($avatar_generator === 'gravatar') {
if (!$email) {
return '';
}
$hash = md5(strtolower(trim($email)));
return 'https://www.gravatar.com/avatar/' . $hash;
}
return $avatar_url;
$hash = $this->get('avatar_hash');
if (!$hash) {
$username = $this->get('username');
$hash = md5(strtolower(trim($email ?? $username)));
}
return $this->generateMultiavatar($hash);
}
protected function generateMultiavatar($hash) {
/**
* @param string $hash
* @return string
*/
protected function generateMultiavatar(string $hash): string
{
/** @var UniformResourceLocator $locator */
$locator = Grav::instance()['locator'];
$storage = Grav::instance()['locator']->findResource('image://multiavatar', true, true);
$avatar_file = "$storage/$hash.svg";
$avatar_url = "/user/images/multiavatar/$hash.svg";
$storage = $locator->findResource('image://multiavatar', true, true);
$avatar_file = "{$storage}/{$hash}.svg";
if (!file_exists($storage)) {
Folder::create($storage);
}
if (!file_exists($avatar_file)) {
$mavatar = new \Multiavatar();
$mavatar = new Multiavatar();
file_put_contents($avatar_file, $mavatar->generate($hash, null, null));
}
$avatar_url = $locator->findResource("image://multiavatar/{$hash}.svg", false, true);
return Utils::url($avatar_url);