mirror of
https://github.com/rico-vz/HeimerdingerLoL.git
synced 2025-12-06 18:20:48 +01:00
feat: Add functionality to retrieve champion images from the database
- Added a new function `getChampionImage` to fetch champion images based on ID and type. - Created a new model `ChampionImage` to store champion image details in the database. - Implemented seeding of champion images using `ChampionImageSeeder`. - Updated usage of champion images in existing methods.
This commit is contained in:
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
use Intervention\Image\Drivers\Gd\Driver;
|
use Intervention\Image\Drivers\Gd\Driver;
|
||||||
use Intervention\Image\ImageManager;
|
use Intervention\Image\ImageManager;
|
||||||
|
use App\Models\ChampionImage;
|
||||||
|
|
||||||
function getRoleIcon($roleName): string
|
function getRoleIcon($roleName): string
|
||||||
{
|
{
|
||||||
@@ -64,3 +65,21 @@ function getRoleIconSvg($roleName): string
|
|||||||
|
|
||||||
return $roleIcons[$roleName];
|
return $roleIcons[$roleName];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the champion image
|
||||||
|
*
|
||||||
|
* @param string $full_id
|
||||||
|
* @param enum $type splash, uncentered_splash, loading, tile, icon, ability, video
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function getChampionImage($full_id, $type): string
|
||||||
|
{
|
||||||
|
$championImage = ChampionImage::where('full_id', $full_id)->where('type', $type)->first();
|
||||||
|
|
||||||
|
if (!$championImage) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
return $championImage->url;
|
||||||
|
}
|
||||||
|
|||||||
@@ -101,19 +101,12 @@ class Champion extends Model
|
|||||||
|
|
||||||
public function getChampionImageAttribute(bool $uncentered = false): string
|
public function getChampionImageAttribute(bool $uncentered = false): string
|
||||||
{
|
{
|
||||||
$baseUrl = 'https://raw.communitydragon.org/pbe/plugins/rcp-be-lol-game-data/global/default/assets/characters/';
|
return getChampionImage($this->champion_id . '000', $uncentered ? 'uncentered_splash' : 'splash');
|
||||||
$championName = strtolower(str_replace([' ', "'", '.'], ['', '', ''], $this->name));
|
|
||||||
$imagePath = 'base/images/';
|
|
||||||
$imageUrl = $baseUrl.$championName.'/skins/'.$imagePath.$championName.'_splash_';
|
|
||||||
$imageUrl .= $uncentered ? 'uncentered' : 'centered';
|
|
||||||
$imageUrl .= '_0.jpg';
|
|
||||||
|
|
||||||
return $imageUrl;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getChampionImageTileAttribute(): string
|
public function getChampionImageTileAttribute(): string
|
||||||
{
|
{
|
||||||
return 'https://raw.communitydragon.org/pbe/plugins/rcp-be-lol-game-data/global/default/v1/champion-tiles/'.$this->champion_id.'/'.$this->champion_id.'000.jpg';
|
return getChampionImage($this->champion_id . '000', 'tile');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getChampionSquareImageAttribute(): string
|
public function getChampionSquareImageAttribute(): string
|
||||||
@@ -121,6 +114,7 @@ class Champion extends Model
|
|||||||
return 'https://raw.communitydragon.org/pbe/plugins/rcp-be-lol-game-data/global/default/v1/champion-icons/'.$this->champion_id.'.png';
|
return 'https://raw.communitydragon.org/pbe/plugins/rcp-be-lol-game-data/global/default/v1/champion-icons/'.$this->champion_id.'.png';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: Implement Ability Icons in the DB and get them from there.
|
||||||
public function getChampionAbilityIconQAttribute(): string
|
public function getChampionAbilityIconQAttribute(): string
|
||||||
{
|
{
|
||||||
return 'https://cdn.communitydragon.org/latest/champion/'.$this->champion_id.'/ability-icon/q';
|
return 'https://cdn.communitydragon.org/latest/champion/'.$this->champion_id.'/ability-icon/q';
|
||||||
|
|||||||
23
app/Models/ChampionImage.php
Normal file
23
app/Models/ChampionImage.php
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Models;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
|
||||||
|
class ChampionImage extends Model
|
||||||
|
{
|
||||||
|
use HasFactory;
|
||||||
|
|
||||||
|
protected $fillable = [
|
||||||
|
'full_id',
|
||||||
|
'champion_id',
|
||||||
|
'type',
|
||||||
|
'url',
|
||||||
|
];
|
||||||
|
|
||||||
|
public function champion()
|
||||||
|
{
|
||||||
|
return $this->belongsTo(Champion::class);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -74,11 +74,7 @@ class ChampionSkin extends Model
|
|||||||
|
|
||||||
public function getSkinImageAttribute(bool $uncentered = false): string
|
public function getSkinImageAttribute(bool $uncentered = false): string
|
||||||
{
|
{
|
||||||
$championName = strtolower(str_replace([' ', "'"], ['', ''], $this->champion->name));
|
return getChampionImage($this->full_skin_id, $uncentered ? 'uncentered_splash' : 'splash');
|
||||||
$imagePath = $uncentered ? 'uncentered_' : 'centered_';
|
|
||||||
$imageUrl = 'https://raw.communitydragon.org/pbe/plugins/rcp-be-lol-game-data/global/default/assets/characters/'.$championName.'/skins/skin'.str_pad($this->skin_id, 2, '0', STR_PAD_LEFT).'/images/'.$championName.'_splash_'.$imagePath.$this->skin_id.'.jpg';
|
|
||||||
|
|
||||||
return $imageUrl;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getSkinImageLoadingAttribute(): string
|
public function getSkinImageLoadingAttribute(): string
|
||||||
|
|||||||
@@ -0,0 +1,33 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
return new class extends Migration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the migrations.
|
||||||
|
*/
|
||||||
|
public function up(): void
|
||||||
|
{
|
||||||
|
Schema::create('champion_images', function (Blueprint $table) {
|
||||||
|
$table->id();
|
||||||
|
$table->text('full_id');
|
||||||
|
$table->integer('champion_id');
|
||||||
|
$table->enum('type', ['splash', 'uncentered_splash', 'loading', 'tile', 'icon', 'ability', 'video']);
|
||||||
|
$table->text('url');
|
||||||
|
$table->foreign('champion_id')->references('champion_id')->on('champions')->onDelete('cascade');
|
||||||
|
|
||||||
|
$table->timestamps();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
*/
|
||||||
|
public function down(): void
|
||||||
|
{
|
||||||
|
Schema::dropIfExists('champion_images');
|
||||||
|
}
|
||||||
|
};
|
||||||
56
database/seeders/ChampionImageSeeder.php
Normal file
56
database/seeders/ChampionImageSeeder.php
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Database\Seeders;
|
||||||
|
|
||||||
|
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
|
||||||
|
use Illuminate\Database\Seeder;
|
||||||
|
use App\Models\ChampionImage;
|
||||||
|
use App\Models\Champion;
|
||||||
|
|
||||||
|
class ChampionImageSeeder extends Seeder
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the database seeds.
|
||||||
|
*/
|
||||||
|
public function run(): void
|
||||||
|
{
|
||||||
|
// Loop over all champions
|
||||||
|
Champion::all()->each(function ($champion) {
|
||||||
|
$dataJson = 'https://raw.communitydragon.org/pbe/plugins/rcp-be-lol-game-data/global/default/v1/champions/' . $champion->champion_id . '.json';
|
||||||
|
|
||||||
|
$data = json_decode(file_get_contents($dataJson), true);
|
||||||
|
|
||||||
|
$championSkins = $data['skins'];
|
||||||
|
|
||||||
|
foreach ($championSkins as $skin) {
|
||||||
|
$splash = new ChampionImage();
|
||||||
|
$splash->full_id = $skin['id'];
|
||||||
|
$splash->champion_id = $champion->champion_id;
|
||||||
|
$splash->type = 'splash';
|
||||||
|
$splash->url = 'https://raw.communitydragon.org/pbe/plugins/rcp-be-lol-game-data/global/default/' . strtolower(substr($skin['splashPath'], strpos($skin['splashPath'], 'ASSETS')));
|
||||||
|
$splash->save();
|
||||||
|
|
||||||
|
$uncenteredSplash = new ChampionImage();
|
||||||
|
$uncenteredSplash->full_id = $skin['id'];
|
||||||
|
$uncenteredSplash->champion_id = $champion->champion_id;
|
||||||
|
$uncenteredSplash->type = 'uncentered_splash';
|
||||||
|
$uncenteredSplash->url = 'https://raw.communitydragon.org/pbe/plugins/rcp-be-lol-game-data/global/default/' . strtolower(substr($skin['uncenteredSplashPath'], strpos($skin['uncenteredSplashPath'], 'ASSETS')));
|
||||||
|
$uncenteredSplash->save();
|
||||||
|
|
||||||
|
$loading = new ChampionImage();
|
||||||
|
$loading->full_id = $skin['id'];
|
||||||
|
$loading->champion_id = $champion->champion_id;
|
||||||
|
$loading->type = 'loading';
|
||||||
|
$loading->url = 'https://raw.communitydragon.org/pbe/plugins/rcp-be-lol-game-data/global/default/' . strtolower(substr($skin['loadScreenPath'], strpos($skin['loadScreenPath'], 'ASSETS')));
|
||||||
|
$loading->save();
|
||||||
|
|
||||||
|
$tile = new ChampionImage();
|
||||||
|
$tile->full_id = $skin['id'];
|
||||||
|
$tile->champion_id = $champion->champion_id;
|
||||||
|
$tile->type = 'tile';
|
||||||
|
$tile->url = 'https://raw.communitydragon.org/pbe/plugins/rcp-be-lol-game-data/global/default/' . strtolower(substr($skin['tilePath'], strpos($skin['tilePath'], 'ASSETS')));
|
||||||
|
$tile->save();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -6,6 +6,7 @@ namespace Database\Seeders;
|
|||||||
use Illuminate\Database\Seeder;
|
use Illuminate\Database\Seeder;
|
||||||
use Illuminate\Support\Facades\Cache;
|
use Illuminate\Support\Facades\Cache;
|
||||||
use Illuminate\Support\Facades\Log;
|
use Illuminate\Support\Facades\Log;
|
||||||
|
use Illuminate\Support\Facades\Artisan;
|
||||||
|
|
||||||
class DatabaseSeeder extends Seeder
|
class DatabaseSeeder extends Seeder
|
||||||
{
|
{
|
||||||
@@ -20,8 +21,10 @@ class DatabaseSeeder extends Seeder
|
|||||||
$this->call(ChampionRolesSeeder::class);
|
$this->call(ChampionRolesSeeder::class);
|
||||||
$this->call(SummonerIconSeeder::class);
|
$this->call(SummonerIconSeeder::class);
|
||||||
$this->call(SummonerEmoteSeeder::class);
|
$this->call(SummonerEmoteSeeder::class);
|
||||||
|
$this->call(ChampionImageSeeder::class);
|
||||||
|
|
||||||
Cache::flush();
|
Cache::flush();
|
||||||
|
Artisan::call('cloudflare:purge');
|
||||||
|
|
||||||
Log::info('Seeding complete at '.date('Y-m-d H:i:s'));
|
Log::info('Seeding complete at '.date('Y-m-d H:i:s'));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -55,10 +55,6 @@
|
|||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="antialiased bg-stone-900 dark scroll-smooth">
|
<body class="antialiased bg-stone-900 dark scroll-smooth">
|
||||||
<div class="py-1 text-center text-black bg-orange-400">
|
|
||||||
<p class="text-sm font-medium">We're aware of an issue where certain images may not display properly. We're currently working on a solution.</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<x-navbar />
|
<x-navbar />
|
||||||
@yield('content')
|
@yield('content')
|
||||||
<x-footer />
|
<x-footer />
|
||||||
|
|||||||
Reference in New Issue
Block a user