From f607ba8a41fcc8e5db0b66ba14a94582738f8d93 Mon Sep 17 00:00:00 2001 From: Pig Fang Date: Wed, 29 Jul 2020 10:57:53 +0800 Subject: [PATCH] add API of fetching avatar and preview by texture hash --- app/Http/Controllers/TextureController.php | 18 ++++++++-- resources/misc/changelogs/en/5.1.0.md | 4 +++ resources/misc/changelogs/zh_CN/5.1.0.md | 4 +++ routes/static.php | 5 ++- .../ControllersTest/TextureControllerTest.php | 34 ++++++++++++++++--- 5 files changed, 58 insertions(+), 7 deletions(-) diff --git a/app/Http/Controllers/TextureController.php b/app/Http/Controllers/TextureController.php index ec350d02..08d39234 100644 --- a/app/Http/Controllers/TextureController.php +++ b/app/Http/Controllers/TextureController.php @@ -39,9 +39,16 @@ class TextureController extends Controller return response()->json($player)->setLastModified($player->last_modified); } - public function preview(Minecraft $minecraft, Request $request, $tid) + public function previewByHash(Minecraft $minecraft, Request $request, $hash) { - $texture = Texture::findOrFail($tid); + $texture = Texture::where('hash', $hash)->firstOrFail(); + + return $this->preview($minecraft, $request, $texture); + } + + public function preview(Minecraft $minecraft, Request $request, Texture $texture) + { + $tid = $texture->tid; $hash = $texture->hash; $usePNG = $request->has('png') || !(imagetypes() & IMG_WEBP); @@ -110,6 +117,13 @@ class TextureController extends Controller return $this->avatar($minecraft, $request, $texture); } + public function avatarByHash(Minecraft $minecraft, Request $request, $hash) + { + $texture = Texture::where('hash', $hash)->first(); + + return $this->avatar($minecraft, $request, $texture); + } + public function avatarByTexture(Minecraft $minecraft, Request $request, $tid) { $texture = Texture::find($tid); diff --git a/resources/misc/changelogs/en/5.1.0.md b/resources/misc/changelogs/en/5.1.0.md index 768acbc1..5fb53f93 100644 --- a/resources/misc/changelogs/en/5.1.0.md +++ b/resources/misc/changelogs/en/5.1.0.md @@ -1,3 +1,7 @@ +## Added + +- Added API of fetching avatar and preview by texture hash. + ## Changed - Select text automatically when click the hash text at texture detail page. diff --git a/resources/misc/changelogs/zh_CN/5.1.0.md b/resources/misc/changelogs/zh_CN/5.1.0.md index eda36130..0f08d6c4 100644 --- a/resources/misc/changelogs/zh_CN/5.1.0.md +++ b/resources/misc/changelogs/zh_CN/5.1.0.md @@ -1,3 +1,7 @@ +## 新增 + +- 新增以材质 hash 方式获取材质的预览图和头像的 API + ## 调整 - 材质详情页中点击 hash 文本时自动选择整条文本 diff --git a/routes/static.php b/routes/static.php index e93aca8c..f0808743 100644 --- a/routes/static.php +++ b/routes/static.php @@ -10,7 +10,10 @@ Route::get('raw/{tid}', 'TextureController@raw'); Route::prefix('avatar')->name('avatar.')->group(function () { Route::get('player/{name}', 'TextureController@avatarByPlayer')->name('player'); Route::get('user/{uid}', 'TextureController@avatarByUser')->name('user'); + Route::get('hash/{hash}', 'TextureController@avatarByHash')->name('hash'); Route::get('{tid}', 'TextureController@avatarByTexture')->name('texture'); }); -Route::get('preview/{tid}', 'TextureController@preview'); +Route::get('preview/{texture}', 'TextureController@preview') + ->middleware(Illuminate\Routing\Middleware\SubstituteBindings::class); +Route::get('preview/hash/{hash}', 'TextureController@previewByHash'); diff --git a/tests/HttpTest/ControllersTest/TextureControllerTest.php b/tests/HttpTest/ControllersTest/TextureControllerTest.php index 58a23357..a2fb5c74 100644 --- a/tests/HttpTest/ControllersTest/TextureControllerTest.php +++ b/tests/HttpTest/ControllersTest/TextureControllerTest.php @@ -42,12 +42,24 @@ class TextureControllerTest extends TestCase ])->assertHeader('Last-Modified'); } + public function testPreviewByHash() + { + $disk = Storage::fake('textures'); + $this->mock(Minecraft::class, function ($mock) { + $mock->shouldReceive('renderSkin')->andReturn(Image::canvas(1, 1)); + $mock->shouldReceive('renderCape')->andReturn(Image::canvas(1, 1)); + }); + + $skin = factory(Texture::class)->create(); + $disk->put($skin->hash, ''); + $this->get('/preview/hash/'.$skin->hash) + ->assertHeader('Content-Type', 'image/webp'); + } + public function testPreview() { $disk = Storage::fake('textures'); - $this->get('/preview/0')->assertNotFound(); - $this->mock(Minecraft::class, function ($mock) { $mock->shouldReceive('renderSkin')->andReturn(Image::canvas(1, 1)); $mock->shouldReceive('renderCape')->andReturn(Image::canvas(1, 1)); @@ -57,8 +69,7 @@ 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'); @@ -182,6 +193,21 @@ class TextureControllerTest extends TestCase $this->assertEquals(50, $image->height()); } + public function testAvatarByHash() + { + $disk = Storage::fake('textures'); + $this->mock(Minecraft::class, function ($mock) { + $mock->shouldReceive('render2dAvatar')->andReturn(Image::canvas(1, 1)); + $mock->shouldReceive('render3dAvatar')->andReturn(Image::canvas(1, 1)); + }); + + $texture = factory(Texture::class)->create(); + $disk->put($texture->hash, ''); + $this->get('/avatar/hash/'.$texture->hash) + ->assertSuccessful() + ->assertHeader('Content-Type', 'image/webp'); + } + public function testAvatarByTexture() { $disk = Storage::fake('textures');