add fallback for creating avatar and preview

This commit is contained in:
Pig Fang 2020-05-21 18:33:01 +08:00
parent 9211e6fb33
commit de44c0b785
2 changed files with 17 additions and 6 deletions

View File

@ -43,6 +43,7 @@ class TextureController extends Controller
{
$texture = Texture::findOrFail($tid);
$hash = $texture->hash;
$usePNG = $request->has('png') || !(imagetypes() & IMG_WEBP);
$disk = Storage::disk('textures');
abort_if($disk->missing($hash), 404);
@ -52,7 +53,7 @@ class TextureController extends Controller
$response = Cache::remember(
'preview-t'.$tid,
option('enable_preview_cache') ? $now->addYear() : $now->addMinute(),
function () use ($minecraft, $disk, $texture, $hash, $height) {
function () use ($minecraft, $disk, $texture, $hash, $height, $usePNG) {
$file = $disk->get($hash);
if ($texture->type === 'cape') {
$image = $minecraft->renderCape($file, $height);
@ -63,7 +64,7 @@ class TextureController extends Controller
$lastModified = $disk->lastModified($hash);
return Image::make($image)
->response('webp', 100)
->response($usePNG ? 'png' : 'webp', 100)
->setLastModified(Carbon::createFromTimestamp($lastModified));
}
);
@ -120,12 +121,13 @@ class TextureController extends Controller
{
$size = (int) $request->query('size', 100);
$mode = $request->has('3d') ? '3d' : '2d';
$usePNG = $request->has('png') || !(imagetypes() & IMG_WEBP);
$disk = Storage::disk('textures');
if (is_null($texture) || $disk->missing($texture->hash)) {
return Image::make(resource_path("misc/textures/avatar$mode.png"))
->resize($size, $size)
->response('webp', 100);
->response($usePNG ? 'png' : 'webp', 100);
}
$hash = $texture->hash;
@ -133,7 +135,7 @@ class TextureController extends Controller
$response = Cache::remember(
'avatar-'.$mode.'-t'.$texture->tid.'-s'.$size,
option('enable_avatar_cache') ? $now->addYear() : $now->addMinute(),
function () use ($minecraft, $disk, $hash, $size, $mode) {
function () use ($minecraft, $disk, $hash, $size, $mode, $usePNG) {
$file = $disk->get($hash);
if ($mode === '3d') {
$image = $minecraft->render3dAvatar($file, 25);
@ -145,7 +147,7 @@ class TextureController extends Controller
return Image::make($image)
->resize($size, $size)
->response('webp', 100)
->response($usePNG ? 'png' : 'webp', 100)
->setLastModified($lastModified);
}
);

View File

@ -57,7 +57,11 @@ class TextureControllerTest extends TestCase
$this->get('/preview/'.$skin->tid)->assertNotFound();
$disk->put($skin->hash, '');
$this->get('/preview/'.$skin->tid)->assertHeader('Content-Type', 'image/webp');
$this->get('/preview/'.$skin->tid)
->assertHeader('Content-Type', 'image/webp');
Cache::clear();
$this->get('/preview/'.$skin->tid.'?png')
->assertHeader('Content-Type', 'image/png');
$this->assertTrue(Cache::has('preview-t'.$skin->tid));
$cape = factory(Texture::class)->states('cape')->create();
@ -124,6 +128,11 @@ class TextureControllerTest extends TestCase
$this->assertEquals(100, $image->width());
$this->assertEquals(100, $image->height());
Cache::clear();
$this->get('/avatar/player/'.$player->name.'?png=true')
->assertSuccessful()
->assertHeader('Content-Type', 'image/png');
$image = $this->get('/avatar/player/'.$player->name.'?size=50')->getContent();
$image = Image::make($image);
$this->assertEquals(50, $image->width());