[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
Signed by: someonewithpc
GPG Key ID: 7D0C7EAFC9D835A0
4 changed files with 61 additions and 26 deletions

View File

@ -19,19 +19,16 @@
namespace Component\Media; namespace Component\Media;
use App\Core\Cache;
use App\Core\Event; use App\Core\Event;
use App\Core\Module; use App\Core\Module;
use App\Util\Common;
use App\Util\Nickname; use App\Util\Nickname;
use Exception;
use Symfony\Component\Asset\Package;
use Symfony\Component\Asset\VersionStrategy\EmptyVersionStrategy;
class Media extends Module class Media extends Module
{ {
public static function __callStatic(string $name, array $args) public static function __callStatic(string $name, array $args)
{ {
return Utils::$name(...$args); return Utils::{$name}(...$args);
} }
public function onAddRoute($r) public function onAddRoute($r)
@ -42,16 +39,20 @@ class Media extends Module
public function onEndTwigPopulateVars(array &$vars) public function onEndTwigPopulateVars(array &$vars)
{ {
try { $vars['user_avatar'] = self::getAvatarUrl();
$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'));
return Event::next; 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\Avatar;
use App\Entity\File; use App\Entity\File;
use App\Util\Common; use App\Util\Common;
use Component\Media\Exception\NoAvatarException;
use Exception; use Exception;
use Symfony\Component\Asset\Package;
use Symfony\Component\Asset\VersionStrategy\EmptyVersionStrategy;
use Symfony\Component\HttpFoundation\BinaryFileResponse; use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\HttpFoundation\File\File as SymfonyFile; use Symfony\Component\HttpFoundation\File\File as SymfonyFile;
use Symfony\Component\HttpFoundation\HeaderUtils; use Symfony\Component\HttpFoundation\HeaderUtils;
@ -86,11 +89,15 @@ abstract class Utils
public static function error($res, string $nickname) 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); Log::error('Avatar query returned more than one result for nickname ' . $nickname);
throw new Exception(_m('Internal server error')); throw new Exception(_m('Internal server error'));
} }
return $res[0];
} }
public static function getAvatar(string $nickname) public static function getAvatar(string $nickname)
@ -99,8 +106,8 @@ abstract class Utils
Cache::get('avatar-' . $nickname, Cache::get('avatar-' . $nickname,
function () use ($nickname) { function () use ($nickname) {
return DB::dql('select a from App\\Entity\\Avatar a ' . return DB::dql('select a from App\\Entity\\Avatar a ' .
'join App\Entity\GSActor p with a.gsactor_id = p.id ' . 'join App\Entity\GSActor g with a.gsactor_id = g.id ' .
'where p.nickname = :nickname', 'where g.nickname = :nickname',
['nickname' => $nickname]); ['nickname' => $nickname]);
}), }),
$nickname $nickname
@ -116,8 +123,8 @@ abstract class Utils
return DB::dql('select f.file_hash, f.mimetype, f.title ' . return DB::dql('select f.file_hash, f.mimetype, f.title ' .
'from App\\Entity\\File f ' . 'from App\\Entity\\File f ' .
'join App\\Entity\\Avatar a with f.id = a.file_id ' . 'join App\\Entity\\Avatar a with f.id = a.file_id ' .
'join App\\Entity\\GSActor p with p.id = a.gsactor_id ' . 'join App\\Entity\\GSActor g with g.id = a.gsactor_id ' .
'where p.nickname = :nickname', 'where g.nickname = :nickname',
['nickname' => $nickname]); ['nickname' => $nickname]);
}), }),
$nickname $nickname
@ -129,4 +136,22 @@ abstract class Utils
return ['file_path' => $filepath, 'mimetype' => 'image/svg+xml', 'title' => null]; 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\DB\DB;
use App\Core\Entity; use App\Core\Entity;
use App\Core\Event;
use DateTimeInterface; use DateTimeInterface;
/** /**
@ -176,7 +177,14 @@ class Note extends Entity
public function getActorNickname() 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 public static function schemaDef(): array

View File

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