From 9586c24f568bd1bef60629e946252a601a5ed95c Mon Sep 17 00:00:00 2001 From: WildEgo Date: Thu, 13 Nov 2025 23:14:02 +0000 Subject: [PATCH] add: Item data service. --- app/Http/Controllers/WikiController.php | 2 +- .../Models/ItemProtoSearchResource.php | 5 ++ app/Providers/AppServiceProvider.php | 3 +- app/Services/ItemDataService.php | 69 +++++++++++++++++++ config/octane.php | 2 + 5 files changed, 79 insertions(+), 2 deletions(-) create mode 100644 app/Services/ItemDataService.php diff --git a/app/Http/Controllers/WikiController.php b/app/Http/Controllers/WikiController.php index 0dbe6c5..b57864b 100644 --- a/app/Http/Controllers/WikiController.php +++ b/app/Http/Controllers/WikiController.php @@ -37,7 +37,7 @@ class WikiController extends Controller return ItemProtoSearchResource::collection( ItemProto::query() ->select('locale_name', 'vnum') - ->when($request->query('query'), fn ($q, $term) => $q->where('locale_name', 'like', "%$term%")) + ->when($request->query('query'), fn ($q, $term) => $q->where('locale_name', 'like', "%$term%")->orWhere('vnum', '=', $term)) ->take(10) ->get() ); diff --git a/app/Http/Resources/Models/ItemProtoSearchResource.php b/app/Http/Resources/Models/ItemProtoSearchResource.php index e45a296..d893d5a 100644 --- a/app/Http/Resources/Models/ItemProtoSearchResource.php +++ b/app/Http/Resources/Models/ItemProtoSearchResource.php @@ -2,6 +2,7 @@ namespace App\Http\Resources\Models; +use App\Services\ItemDataService; use Illuminate\Http\Request; use Illuminate\Http\Resources\Json\JsonResource; @@ -14,9 +15,13 @@ class ItemProtoSearchResource extends JsonResource */ public function toArray(Request $request): array { + $staticData = app(ItemDataService::class); + return [ 'vnum' => $this->vnum, 'name' => $this->locale_name, + 'icon' => $staticData->getIcon($this->vnum), + 'description' => $staticData->getDescription($this->vnum), ]; } } diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index e3092eb..1dbd5b4 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -2,6 +2,7 @@ namespace App\Providers; +use App\Services\ItemDataService; use Illuminate\Support\Facades\Schema; use Illuminate\Support\ServiceProvider; @@ -12,7 +13,7 @@ class AppServiceProvider extends ServiceProvider */ public function register(): void { - // + $this->app->singleton(ItemDataService::class); } /** diff --git a/app/Services/ItemDataService.php b/app/Services/ItemDataService.php new file mode 100644 index 0000000..ab0ef52 --- /dev/null +++ b/app/Services/ItemDataService.php @@ -0,0 +1,69 @@ +loadData(); + } + + protected function loadData() + { + if (self::$loaded) { + return; + } + + if (Storage::has('item-data/item_list.txt')) { + self::$icons = collect(explode("\n", Storage::get('item-data/item_list.txt'))) + ->map(fn ($line) => str_getcsv($line, "\t")) + ->filter(fn ($item) => isset($item[0], $item[2])) + ->mapWithKeys(fn ($item) => [intval($item[0]) => str($item[2])->basename()->replaceMatches('/tga|dds/i', 'png')]) + ->toArray(); + } else { + self::$icons = []; + } + + if (Storage::has('item-data/itemdesc.txt')) { + self::$descriptions = collect(explode("\n", Storage::get('item-data/itemdesc.txt'))) + ->map(fn ($line) => str_getcsv($line, "\t")) + ->filter(fn ($item) => isset($item[0], $item[2])) + ->mapWithKeys(fn ($item) => [intval($item[0]) => $item[2]]) + ->toArray(); + } else { + self::$descriptions = []; + } + + self::$loaded = true; + } + + public function getIcon(int $vnum): ?string + { + $this->loadData(); + + return self::$icons[$vnum] ?? null; + } + + public function getDescription(int $vnum): ?string + { + $this->loadData(); + + return self::$descriptions[$vnum] ?? null; + } + + public static function flush(): void + { + self::$loaded = false; + self::$icons = []; + self::$descriptions = []; + } +} diff --git a/config/octane.php b/config/octane.php index 8cfba01..24ff4a3 100644 --- a/config/octane.php +++ b/config/octane.php @@ -1,5 +1,6 @@ [ ...Octane::defaultServicesToWarm(), + ItemDataService::class, ], 'flush' => [