diff --git a/README.md b/README.md index 31b7fee..fcac90c 100644 --- a/README.md +++ b/README.md @@ -42,3 +42,23 @@ Returns the cape of the given user. | -------------- | --------- | ----------------------- | | `access_token` | string | The user's access token | | `cape` | image/png | The cape file | + +### Json + +**GET** `/api/skin-api/textures/{user_name}` +Return the json like this +``` +{ + "SKIN": { + "url": "http://example.com/api/skin-api/skins/gfortes", + "digest": "SHA256 HASH (HEX)", + "metadata": { + "model": "slim" + } + }, + "CAPE": { + "url": "http://example.com/api/skin-api/capes/gfortes", + "digest": "SHA256 HASH (HEX)" + } +} +``` diff --git a/routes/api.php b/routes/api.php index 242165a..205afd0 100644 --- a/routes/api.php +++ b/routes/api.php @@ -1,6 +1,7 @@ name('capes.update'); Route::delete('/capes', [ApiController::class, 'deleteCape'])->name('capes.delete'); + +// Json Provider +Route::get('/textures/{username}', [TextureJsonController::class, 'handle']); diff --git a/src/Controllers/TextureJsonController.php b/src/Controllers/TextureJsonController.php new file mode 100644 index 0000000..d8808ff --- /dev/null +++ b/src/Controllers/TextureJsonController.php @@ -0,0 +1,72 @@ +first(); + + $result = []; + $userId = $user ? $user->id : null; + + //SKIN + if ($userId && Storage::disk('public')->exists("skins/{$userId}.png")) { + $skinFile = "skins/{$userId}.png"; + } elseif (Storage::disk('public')->exists("skins/default.png")) { + $skinFile = "skins/default.png"; + } else { + $skinFile = null; + } + + if ($skinFile) { + $skinPath = Storage::disk('public')->path($skinFile); + + $result['SKIN'] = [ + 'url' => url("/api/skin-api/skins/$username"), + 'digest' => hash_file('sha256', $skinPath), + 'metadata' => [ + 'model' => $this->detectModel($skinPath) + ] + ]; + } + + //CAPE + if ($userId && Storage::disk('public')->exists("capes/{$userId}.png")) { + $capeFile = "capes/{$userId}.png"; + } elseif (Storage::disk('public')->exists("capes/default.png")) { + $capeFile = "capes/default.png"; + } else { + $capeFile = null; + } + + if ($capeFile) { + $capePath = Storage::disk('public')->path($capeFile); + + $result['CAPE'] = [ + 'url' => url("/api/skin-api/capes/$username"), + 'digest' => hash_file('sha256', $capePath) + ]; + } + + return response()->json($result, 200, [], JSON_UNESCAPED_SLASHES); + } + + private function detectModel(string $path): string + { + $img = imagecreatefrompng($path); + + $rgb = imagecolorat($img,55,20); + $colors = imagecolorsforindex($img, $rgb); + $alpha = $colors["alpha"]; + imagedestroy($img); + + + return $alpha === 127 ? 'slim' : 'default'; + } +}