From 24cb218060c84c78b5a4b63f61692983d6950af1 Mon Sep 17 00:00:00 2001 From: Sarjuuk Date: Wed, 6 Aug 2025 17:07:35 +0200 Subject: [PATCH] Template/Update (Part 5) * convert data loader --- endpoints/data/data.php | 149 ++++++++++++++++++++++++++++ includes/ajaxHandler/data.class.php | 143 -------------------------- 2 files changed, 149 insertions(+), 143 deletions(-) create mode 100644 endpoints/data/data.php delete mode 100644 includes/ajaxHandler/data.class.php diff --git a/endpoints/data/data.php b/endpoints/data/data.php new file mode 100644 index 00000000..174e24c2 --- /dev/null +++ b/endpoints/data/data.php @@ -0,0 +1,149 @@ + ['filter' => FILTER_CALLBACK, 'options' => [Locale::class, 'tryFrom'] ], + 't' => ['filter' => FILTER_CALLBACK, 'options' => [self::class, 'checkTextLine' ]], + 'catg' => ['filter' => FILTER_VALIDATE_INT ], + 'skill' => ['filter' => FILTER_CALLBACK, 'options' => [self::class, 'checkSkill' ]], + 'class' => ['filter' => FILTER_VALIDATE_INT, 'options' => ['min_range' => 1, 'max_range' => 11]], + 'callback' => ['filter' => FILTER_CALLBACK, 'options' => [self::class, 'checkCallback' ]] + ); + + public function __construct(string $pageParam) + { + parent::__construct($pageParam); + + if ($this->_get['locale']?->validate()) + Lang::load($this->_get['locale']); + } + + protected function generate() : void + { + // different data can be strung together + foreach ($this->params as $set) + { + // requires valid token to hinder automated access + if ($set != 'item-scaling' && (!$this->_get['t'] || empty($_SESSION['dataKey']) || $this->_get['t'] != $_SESSION['dataKey'])) + { + trigger_error('DataBaseResponse::generate - session data key empty or expired', E_USER_ERROR); + continue; + } + + /* issue on no initial data: + when we loadOnDemand, the jScript tries to generate the catg-tree before it is initialized + it cant be initialized, without loading the data as empty catg are omitted + loading the data triggers the generation of the catg-tree + */ + + $this->result .= match($set) + { + 'factions' => $this->loadProfilerData($set), + 'mounts' => $this->loadProfilerData($set, SKILL_MOUNTS), + 'companions' => $this->loadProfilerData($set, SKILL_COMPANIONS), + 'quests' => $this->loadProfilerQuests($set, $this->_get['catg']), + 'recipes' => $this->loadProfilerRecipes(), + // locale independent + 'quick-excludes', + 'weight-presets', + 'item-scaling', + 'realms', + 'statistics' => $this->loadAgnosticFile($set), + // localized + 'talents', + 'achievements', + 'pet-talents', + 'glyphs', + 'gems', + 'enchants', + 'itemsets', + 'pets', + 'zones' => $this->loadLocalizedFile($set), + default => (function($x) { trigger_error('DataBaseResponse::generate - invalid file "'.$x.'" in request', E_USER_ERROR); })($set), + }; + } + } + + private function loadProfilerRecipes() : string + { + if (!$this->_get['callback'] || !$this->_get['skill']) + return ''; + + $result = ''; + + foreach ($this->_get['skill'] as $s) + Util::loadStaticFile('p-recipes-'.$s, $result, true); + + Util::loadStaticFile('p-recipes-sec', $result, true); + $result .= "\n\$WowheadProfiler.loadOnDemand('recipes', null);\n"; + + return $result; + } + + private function loadProfilerQuests(string $file, ?string $catg = null) : string + { + $result = ''; + + if ($catg === null) + Util::loadStaticFile('p-'.$file, $result, false); + else + Util::loadStaticFile('p-'.$file.'-'.$catg, $result, true); + + $result .= "\n\$WowheadProfiler.loadOnDemand('".$file."', ".($catg ?? 'null').");\n"; + + return $result; + } + + private function loadProfilerData(string $file, ?string $catg = null) : string + { + $result = ''; + + if ($this->_get['callback']) + if (Util::loadStaticFile('p-'.$file, $result, true)) + $result .= "\n\$WowheadProfiler.loadOnDemand('".$file."', ".($catg ?? 'null').");\n"; + + return $result; + } + + private function loadAgnosticFile(string $file) : string + { + $result = ''; + + if (!Util::loadStaticFile($file, $result) && Cfg::get('DEBUG')) + $result .= "alert('could not fetch static data: ".$file."');"; + + return $result . "\n\n"; + } + + private function loadLocalizedFile(string $file) : string + { + $result = ''; + + if ($file == 'talents' && ($_ = $this->_get['class'])) + $file .= "-".$_; + + if (!Util::loadStaticFile($file, $result, true) && Cfg::get('DEBUG')) + $result .= "alert('could not fetch static data: ".$file." for locale: ".Lang::getLocale()->json()."');"; + + return $result . "\n\n"; + } + + protected static function checkSkill(string $val) : array + { + return array_intersect(array_merge(SKILLS_TRADE_PRIMARY, [SKILL_FIRST_AID, SKILL_COOKING, SKILL_FISHING]), explode(',', $val)); + } + + protected static function checkCallback(string $val) : bool + { + return substr($val, 0, 29) === '$WowheadProfiler.loadOnDemand'; + } +} + +?> diff --git a/includes/ajaxHandler/data.class.php b/includes/ajaxHandler/data.class.php deleted file mode 100644 index ae6ba054..00000000 --- a/includes/ajaxHandler/data.class.php +++ /dev/null @@ -1,143 +0,0 @@ - ['filter' => FILTER_CALLBACK, 'options' => 'Aowow\Locale::tryFrom' ], - 't' => ['filter' => FILTER_CALLBACK, 'options' => 'Aowow\AjaxHandler::checkTextLine'], - 'catg' => ['filter' => FILTER_SANITIZE_NUMBER_INT ], - 'skill' => ['filter' => FILTER_CALLBACK, 'options' => 'Aowow\AjaxData::checkSkill' ], - 'class' => ['filter' => FILTER_SANITIZE_NUMBER_INT ], - 'callback' => ['filter' => FILTER_CALLBACK, 'options' => 'Aowow\AjaxData::checkCallback' ] - ); - - public function __construct(array $params) - { - parent::__construct($params); - - if ($this->_get['locale']?->validate()) - Lang::load($this->_get['locale']); - - // always this one - $this->handler = 'handleData'; - } - - /* responses - - */ - protected function handleData() : string - { - $result = ''; - - // different data can be strung together - foreach ($this->params as $set) - { - // requires valid token to hinder automated access - if ($set != 'item-scaling' && (!$this->_get['t'] || empty($_SESSION['dataKey']) || $this->_get['t'] != $_SESSION['dataKey'])) - { - trigger_error('AjaxData::handleData - session data key empty or expired', E_USER_ERROR); - continue; - } - - switch ($set) - { - /* issue on no initial data: - when we loadOnDemand, the jScript tries to generate the catg-tree before it is initialized - it cant be initialized, without loading the data as empty catg are omitted - loading the data triggers the generation of the catg-tree - */ - case 'factions': - $result .= $this->loadProfilerData($set); - break; - case 'companions': - $result .= $this->loadProfilerData($set, SKILL_COMPANIONS); - break; - case 'mounts': - $result .= $this->loadProfilerData($set, SKILL_MOUNTS); - break; - case 'quests': - $catg = isset($this->_get['catg']) ? $this->_get['catg'] : 'null'; - if ($catg == 'null') - Util::loadStaticFile('p-'.$set, $result, false); - else - Util::loadStaticFile('p-'.$set.'-'.$catg, $result, true); - - $result .= "\n\$WowheadProfiler.loadOnDemand('".$set."', ".$catg.");\n"; - - break; - case 'recipes': - if (!$this->_get['callback'] || !$this->_get['skill']) - break; - - foreach ($this->_get['skill'] as $s) - Util::loadStaticFile('p-recipes-'.$s, $result, true); - - Util::loadStaticFile('p-recipes-sec', $result, true); - $result .= "\n\$WowheadProfiler.loadOnDemand('recipes', null);\n"; - - break; - // locale independent - case 'quick-excludes': - case 'weight-presets': - case 'item-scaling': - case 'realms': - case 'statistics': - if (!Util::loadStaticFile($set, $result) && Cfg::get('DEBUG')) - $result .= "alert('could not fetch static data: ".$set."');"; - - $result .= "\n\n"; - break; - // localized - case 'talents': - if ($_ = $this->_get['class']) - $set .= "-".$_; - case 'achievements': - case 'pet-talents': - case 'glyphs': - case 'gems': - case 'enchants': - case 'itemsets': - case 'pets': - case 'zones': - if (!Util::loadStaticFile($set, $result, true) && Cfg::get('DEBUG')) - $result .= "alert('could not fetch static data: ".$set." for locale: ".Lang::getLocale()->json()."');"; - - $result .= "\n\n"; - break; - default: - trigger_error('AjaxData::handleData - invalid file "'.$set.'" in request', E_USER_ERROR); - break; - } - } - - return $result; - } - - protected static function checkSkill(string $val) : array - { - return array_intersect(array_merge(SKILLS_TRADE_PRIMARY, [SKILL_FIRST_AID, SKILL_COOKING, SKILL_FISHING]), explode(',', $val)); - } - - protected static function checkCallback(string $val) : bool - { - return substr($val, 0, 29) === '$WowheadProfiler.loadOnDemand'; - } - - private function loadProfilerData(string $file, string $catg = 'null') : string - { - $result = ''; - if ($this->_get['callback']) - if (Util::loadStaticFile('p-'.$file, $result, true)) - $result .= "\n\$WowheadProfiler.loadOnDemand('".$file."', ".$catg.");\n"; - - return $result; - } - -} - -?>