[UI][MEDIA] Add actor avatar in feed timeline

This commit is contained in:
Hugo Sales 2020-08-19 15:31:52 +00:00 committed by Hugo Sales
parent de22f18abf
commit e3c5d7e5dc
No known key found for this signature in database
GPG Key ID: 7D0C7EAFC9D835A0
4 changed files with 61 additions and 26 deletions

View File

@ -19,19 +19,16 @@
namespace Component\Media;
use App\Core\Cache;
use App\Core\Event;
use App\Core\Module;
use App\Util\Common;
use App\Util\Nickname;
use Exception;
use Symfony\Component\Asset\Package;
use Symfony\Component\Asset\VersionStrategy\EmptyVersionStrategy;
class Media extends Module
{
public static function __callStatic(string $name, array $args)
{
return Utils::$name(...$args);
return Utils::{$name}(...$args);
}
public function onAddRoute($r)
@ -42,16 +39,20 @@ class Media extends Module
public function onEndTwigPopulateVars(array &$vars)
{
try {
$user = Common::user();
if ($user != null) {
$vars['user_avatar'] = self::getAvatar($user->getNickname())->getUrl();
return Event::next;
}
} catch (Exception $e) {
}
$package = new Package(new EmptyVersionStrategy());
$vars['user_avatar'] = $package->getUrl(Common::config('avatar', 'default'));
$vars['user_avatar'] = self::getAvatarUrl();
return Event::next;
}
public function onGetAvatarUrl(string $nickname, ?string &$url)
{
$url = self::getAvatarUrl($nickname);
return Event::next;
}
public function onDeleteCachedAvatar(string $nickname)
{
Cache::delete('avatar-' . $nickname);
Cache::delete('avatar-url-' . $nickname);
Cache::delete('avatar-file-info-' . $nickname);
}
}

View File

@ -28,7 +28,10 @@ use App\Core\Log;
use App\Entity\Avatar;
use App\Entity\File;
use App\Util\Common;
use Component\Media\Exception\NoAvatarException;
use Exception;
use Symfony\Component\Asset\Package;
use Symfony\Component\Asset\VersionStrategy\EmptyVersionStrategy;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\HttpFoundation\File\File as SymfonyFile;
use Symfony\Component\HttpFoundation\HeaderUtils;
@ -86,11 +89,15 @@ abstract class Utils
public static function error($res, string $nickname)
{
if (count($res) > 1) {
switch (count($res)) {
case 0:
throw new NoAvatarException();
case 1:
return $res[0];
default:
Log::error('Avatar query returned more than one result for nickname ' . $nickname);
throw new Exception(_m('Internal server error'));
}
return $res[0];
}
public static function getAvatar(string $nickname)
@ -99,8 +106,8 @@ abstract class Utils
Cache::get('avatar-' . $nickname,
function () use ($nickname) {
return DB::dql('select a from App\\Entity\\Avatar a ' .
'join App\Entity\GSActor p with a.gsactor_id = p.id ' .
'where p.nickname = :nickname',
'join App\Entity\GSActor g with a.gsactor_id = g.id ' .
'where g.nickname = :nickname',
['nickname' => $nickname]);
}),
$nickname
@ -116,8 +123,8 @@ abstract class Utils
return DB::dql('select f.file_hash, f.mimetype, f.title ' .
'from App\\Entity\\File f ' .
'join App\\Entity\\Avatar a with f.id = a.file_id ' .
'join App\\Entity\\GSActor p with p.id = a.gsactor_id ' .
'where p.nickname = :nickname',
'join App\\Entity\\GSActor g with g.id = a.gsactor_id ' .
'where g.nickname = :nickname',
['nickname' => $nickname]);
}),
$nickname
@ -129,4 +136,22 @@ abstract class Utils
return ['file_path' => $filepath, 'mimetype' => 'image/svg+xml', 'title' => null];
}
}
public static function getAvatarUrl(string $nickname = null)
{
if ($nickname == null) {
$user = Common::user();
if ($user != null) {
$nickname = $user->getNickname();
}
}
return Cache::get('avatar-url-' . $nickname, function () use ($nickname) {
try {
return self::getAvatar($nickname)->getUrl();
} catch (NoAvatarException $e) {
}
$package = new Package(new EmptyVersionStrategy());
return $package->getUrl(Common::config('avatar', 'default'));
});
}
}

View File

@ -23,6 +23,7 @@ namespace App\Entity;
use App\Core\DB\DB;
use App\Core\Entity;
use App\Core\Event;
use DateTimeInterface;
/**
@ -176,7 +177,14 @@ class Note extends Entity
public function getActorNickname()
{
return DB::find('gsactor', $this->gsactor_id)->getNickname();
return GSActor::getNicknameFromId($this->gsactor_id);
}
public function getAvatarUrl()
{
$url = null;
Event::handle('get_avatar_url', [$this->getActorNickname(), &$url]);
return $url;
}
public static function schemaDef(): array

View File

@ -59,10 +59,11 @@
<div class="notes">
{% if notes is defined %}
{% for note in notes %}
<div>
<b>{{ note.getActorNickname() }}</b>
<div>{{ note.getContent() }}</div>
</div>
<div>
<img src="{{ note.getAvatarUrl() }}" alt="{{ note.getActorNickname() }}'s avatar" width="64px">
<b>{{ note.getActorNickname() }}</b>
<div>{{ note.getContent() }}</div>
</div>
{% endfor %}
{% else %}
{{ 'No notes here.' | trans }}