diff --git a/website/class/config.php b/website/class/config.php index fa7c508d..ac9dea1b 100644 --- a/website/class/config.php +++ b/website/class/config.php @@ -13,4 +13,3 @@ define('STEAM_API_KEY', ''); define('STEAM_DOMAIN_NAME', ''); define('STEAM_LOGOUT_PAGE', ''); define('STEAM_LOGIN_PAGE', ''); - diff --git a/website/class/utils.php b/website/class/utils.php index 6454387c..a37ade47 100644 --- a/website/class/utils.php +++ b/website/class/utils.php @@ -1,95 +1,159 @@ 'weapon_bayonet', + 503 => 'weapon_knife_css', + 505 => 'weapon_knife_flip', + 506 => 'weapon_knife_gut', + 507 => 'weapon_knife_karambit', + 508 => 'weapon_knife_m9_bayonet', + 509 => 'weapon_knife_tactical', + 512 => 'weapon_knife_falchion', + 514 => 'weapon_knife_survival_bowie', + 515 => 'weapon_knife_butterfly', + 516 => 'weapon_knife_push', + 517 => 'weapon_knife_cord', + 518 => 'weapon_knife_canis', + 519 => 'weapon_knife_ursus', + 520 => 'weapon_knife_gypsy_jackknife', + 521 => 'weapon_knife_outdoor', + 522 => 'weapon_knife_stiletto', + 523 => 'weapon_knife_widowmaker', + 525 => 'weapon_knife_skeleton', + 526 => 'weapon_knife_css' + ]; + + // Weapon categories for better organization + private const WEAPON_CATEGORIES = [ + 'Rifles' => [7, 8, 10, 13, 16, 60, 39, 40, 38], + 'Pistols' => [1, 2, 3, 4, 30, 32, 36, 61, 63, 64], + 'SMGs' => [17, 19, 24, 26, 33, 34], + 'Shotguns' => [25, 27, 29, 35], + 'Snipers' => [9, 11, 38], + 'Machine Guns' => [14, 28], + 'Grenades' => [43, 44, 45, 46, 47, 48] + ]; + + private static $skinCache = null; + private static $weaponCache = null; + private static $knifeCache = null; + + public static function getKnifeDefindexes(): array + { + return self::KNIFE_DEFINDEXES; + } + + public static function getKnifeMapping(): array + { + return self::KNIFE_MAPPING; + } + + public static function getWeaponCategories(): array + { + return self::WEAPON_CATEGORIES; + } + public static function skinsFromJson(): array { + if (self::$skinCache !== null) { + return self::$skinCache; + } + $skins = []; - $json = json_decode(file_get_contents(__DIR__ . "/../data/".SKIN_LANGUAGE.".json"), true); + $jsonFile = __DIR__ . "/../data/" . SKIN_LANGUAGE . ".json"; + + if (!file_exists($jsonFile)) { + return []; + } + + $json = json_decode(file_get_contents($jsonFile), true); + if (!$json) { + return []; + } foreach ($json as $skin) { - $skins[(int) $skin['weapon_defindex']][(int) $skin['paint']] = [ + $defindex = (int) $skin['weapon_defindex']; + $paintId = (int) $skin['paint']; + + $skins[$defindex][$paintId] = [ 'weapon_name' => $skin['weapon_name'], 'paint_name' => $skin['paint_name'], 'image_url' => $skin['image'], ]; } + self::$skinCache = $skins; return $skins; } - public static function getWeaponsFromArray() + public static function getWeaponsFromArray(): array { - $weapons = []; - $temp = self::skinsFromJson(); - - foreach ($temp as $key => $value) { - if (key_exists($key, $weapons)) - continue; - - $weapons[$key] = [ - 'weapon_name' => $value[0]['weapon_name'], - 'paint_name' => $value[0]['paint_name'], - 'image_url' => $value[0]['image_url'], - ]; + if (self::$weaponCache !== null) { + return self::$weaponCache; } + $weapons = []; + $skins = self::skinsFromJson(); + + foreach ($skins as $defindex => $skinList) { + if (!isset($weapons[$defindex]) && isset($skinList[0])) { + $weapons[$defindex] = [ + 'weapon_name' => $skinList[0]['weapon_name'], + 'paint_name' => $skinList[0]['paint_name'], + 'image_url' => $skinList[0]['image_url'], + ]; + } + } + + self::$weaponCache = $weapons; return $weapons; } - public static function getKnifeTypes() + public static function getKnifeTypes(): array { - $knifes = []; - $temp = self::getWeaponsFromArray(); - - foreach ($temp as $key => $weapon) { - if ( - !in_array($key, [ - 500, - 503, - 505, - 506, - 507, - 508, - 509, - 512, - 514, - 515, - 516, - 517, - 518, - 519, - 520, - 521, - 522, - 523, - 525, - 526 - ]) - ) - continue; - - $knifes[$key] = [ - 'weapon_name' => $weapon['weapon_name'], - 'paint_name' => rtrim(explode("|", $weapon['paint_name'])[0]), - 'image_url' => $weapon['image_url'], - ]; - $knifes[0] = [ - 'weapon_name' => "weapon_knife", - 'paint_name' => "Default knife", - 'image_url' => "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/weapon_knife.png", - ]; + if (self::$knifeCache !== null) { + return self::$knifeCache; } + $knifes = []; + $weapons = self::getWeaponsFromArray(); + + foreach (self::KNIFE_DEFINDEXES as $defindex) { + if (isset($weapons[$defindex])) { + $weapon = $weapons[$defindex]; + $knifes[$defindex] = [ + 'weapon_name' => $weapon['weapon_name'], + 'paint_name' => rtrim(explode("|", $weapon['paint_name'])[0]), + 'image_url' => $weapon['image_url'], + ]; + } + } + + // Add default knife + $knifes[0] = [ + 'weapon_name' => "weapon_knife", + 'paint_name' => "Default knife", + 'image_url' => "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/weapon_knife.png", + ]; + ksort($knifes); + self::$knifeCache = $knifes; return $knifes; } - public static function getSelectedSkins(array $temp) + public static function getSelectedSkins(array $queryResult): array { $selected = []; - foreach ($temp as $weapon) { - $selected[$weapon['weapon_defindex']] = [ + foreach ($queryResult as $weapon) { + $selected[$weapon['weapon_defindex']] = [ 'weapon_paint_id' => $weapon['weapon_paint_id'], 'weapon_seed' => $weapon['weapon_seed'], 'weapon_wear' => $weapon['weapon_wear'], @@ -98,4 +162,23 @@ class UtilsClass return $selected; } + + public static function isKnifeDefindex(int $defindex): bool + { + return in_array($defindex, self::KNIFE_DEFINDEXES); + } + + public static function isKnifeWeapon(array $weapon): bool + { + return $weapon['weapon_name'] === 'weapon_knife' || + strpos($weapon['weapon_name'], 'knife') !== false || + strpos($weapon['paint_name'], '★') !== false; + } + + public static function clearCache(): void + { + self::$skinCache = null; + self::$weaponCache = null; + self::$knifeCache = null; + } } diff --git a/website/class/weapon_handler.php b/website/class/weapon_handler.php new file mode 100644 index 00000000..1a675abb --- /dev/null +++ b/website/class/weapon_handler.php @@ -0,0 +1,304 @@ +db = new DataBase(); + $this->steamid = $steamid; + } + + public function handleWeaponUpdate($postData): bool + { + if (!isset($postData['forma'])) { + return false; + } + + $formaParts = explode("-", $postData['forma']); + + if ($formaParts[0] === "knife") { + return $this->handleKnifeSelection($formaParts[1]); + } else { + return $this->handleWeaponSkin($formaParts, $postData); + } + } + + private function handleKnifeSelection($knifeId): bool + { + $knifes = UtilsClass::getKnifeTypes(); + + if (!isset($knifes[$knifeId])) { + return false; + } + + $knifeData = $knifes[$knifeId]; + + // Clear existing knife data + $this->clearKnifeData(); + + // Set new knife selection (insert for both teams separately) + $this->db->query( + "INSERT INTO `wp_player_knife` (`steamid`, `knife`, `weapon_team`) VALUES (:steamid, :knife, 2)", + ["steamid" => $this->steamid, "knife" => $knifeData['weapon_name']] + ); + + $this->db->query( + "INSERT INTO `wp_player_knife` (`steamid`, `knife`, `weapon_team`) VALUES (:steamid, :knife, 3)", + ["steamid" => $this->steamid, "knife" => $knifeData['weapon_name']] + ); + + return true; + } + + private function handleWeaponSkin($formaParts, $postData): bool + { + $defindex = $formaParts[0]; + $paintId = $formaParts[1]; + + $skins = UtilsClass::skinsFromJson(); + + if (!isset($skins[$defindex][$paintId]) || + !isset($postData['wear']) || + !isset($postData['seed'])) { + return false; + } + + $wear = $this->validateWear($postData['wear']); + $seed = $this->validateSeed($postData['seed']); + + if ($wear === false || $seed === false) { + return false; + } + + // Handle knife skins + if (UtilsClass::isKnifeDefindex($defindex)) { + $this->handleKnifeSkin($defindex, $paintId, $wear, $seed); + } else { + $this->handleRegularWeaponSkin($defindex, $paintId, $wear, $seed); + } + + return true; + } + + private function handleKnifeSkin($defindex, $paintId, $wear, $seed): void + { + $knifeMapping = UtilsClass::getKnifeMapping(); + + // Clear existing knife data + $this->clearKnifeData(); + + // Clear other knife skins + $knifeDefindexes = UtilsClass::getKnifeDefindexes(); + foreach ($knifeDefindexes as $knifeDefindex) { + if ($knifeDefindex != $defindex) { + $this->db->query( + "DELETE FROM `wp_player_skins` WHERE `steamid` = :steamid AND `weapon_defindex` = :weapon_defindex", + ["steamid" => $this->steamid, "weapon_defindex" => $knifeDefindex] + ); + } + } + + // Set knife type in wp_player_knife table + if (isset($knifeMapping[$defindex])) { + $this->db->query( + "INSERT INTO `wp_player_knife` (`steamid`, `knife`, `weapon_team`) VALUES (:steamid, :knife, 2)", + ["steamid" => $this->steamid, "knife" => $knifeMapping[$defindex]] + ); + + $this->db->query( + "INSERT INTO `wp_player_knife` (`steamid`, `knife`, `weapon_team`) VALUES (:steamid, :knife, 3)", + ["steamid" => $this->steamid, "knife" => $knifeMapping[$defindex]] + ); + } + + // Set knife skin + $this->upsertWeaponSkin($defindex, $paintId, $wear, $seed); + } + + private function handleRegularWeaponSkin($defindex, $paintId, $wear, $seed): void + { + $this->upsertWeaponSkin($defindex, $paintId, $wear, $seed); + } + + private function upsertWeaponSkin($defindex, $paintId, $wear, $seed): void + { + $selectedSkins = $this->getSelectedSkins(); + + if (array_key_exists($defindex, $selectedSkins)) { + // Update existing + $this->db->query( + "UPDATE wp_player_skins SET weapon_paint_id = :weapon_paint_id, weapon_wear = :weapon_wear, weapon_seed = :weapon_seed WHERE steamid = :steamid AND weapon_defindex = :weapon_defindex", + [ + "weapon_paint_id" => $paintId, + "weapon_wear" => $wear, + "weapon_seed" => $seed, + "steamid" => $this->steamid, + "weapon_defindex" => $defindex + ] + ); + } else { + // Insert new for both teams + $this->db->query( + "INSERT INTO wp_player_skins (`steamid`, `weapon_defindex`, `weapon_paint_id`, `weapon_wear`, `weapon_seed`, `weapon_team`) VALUES (:steamid, :weapon_defindex, :weapon_paint_id, :weapon_wear, :weapon_seed, 2)", + [ + "steamid" => $this->steamid, + "weapon_defindex" => $defindex, + "weapon_paint_id" => $paintId, + "weapon_wear" => $wear, + "weapon_seed" => $seed + ] + ); + + $this->db->query( + "INSERT INTO wp_player_skins (`steamid`, `weapon_defindex`, `weapon_paint_id`, `weapon_wear`, `weapon_seed`, `weapon_team`) VALUES (:steamid, :weapon_defindex, :weapon_paint_id, :weapon_wear, :weapon_seed, 3)", + [ + "steamid" => $this->steamid, + "weapon_defindex" => $defindex, + "weapon_paint_id" => $paintId, + "weapon_wear" => $wear, + "weapon_seed" => $seed + ] + ); + } + } + + private function clearKnifeData(): void + { + $knifeDefindexes = UtilsClass::getKnifeDefindexes(); + + // Clear knife skins + foreach ($knifeDefindexes as $knifeDefindex) { + $this->db->query( + "DELETE FROM `wp_player_skins` WHERE `steamid` = :steamid AND `weapon_defindex` = :weapon_defindex", + ["steamid" => $this->steamid, "weapon_defindex" => $knifeDefindex] + ); + } + + // Clear basic knife selection + $this->db->query( + "DELETE FROM `wp_player_knife` WHERE `steamid` = :steamid", + ["steamid" => $this->steamid] + ); + } + + private function validateWear($wear) + { + $wear = floatval($wear); + return ($wear >= 0.00 && $wear <= 1.00) ? $wear : false; + } + + private function validateSeed($seed) + { + $seed = intval($seed); + return ($seed >= 0) ? $seed : false; + } + + public function getSelectedSkins(): array + { + $query = $this->db->select( + "SELECT `weapon_defindex`, MAX(`weapon_paint_id`) AS `weapon_paint_id`, MAX(`weapon_wear`) AS `weapon_wear`, MAX(`weapon_seed`) AS `weapon_seed` + FROM `wp_player_skins` + WHERE `steamid` = :steamid + GROUP BY `weapon_defindex`, `steamid`", + ["steamid" => $this->steamid] + ); + + return UtilsClass::getSelectedSkins($query ?: []); + } + + public function getSelectedKnife(): array + { + return $this->db->select( + "SELECT * FROM `wp_player_knife` WHERE `steamid` = :steamid LIMIT 1", + ["steamid" => $this->steamid] + ) ?: []; + } + + public function getLoadoutData(): array + { + $weapons = UtilsClass::getWeaponsFromArray(); + $knifes = UtilsClass::getKnifeTypes(); + $selectedSkins = $this->getSelectedSkins(); + $selectedKnife = $this->getSelectedKnife(); + + return [ + 'weapons' => $weapons, + 'knifes' => $knifes, + 'selectedSkins' => $selectedSkins, + 'selectedKnife' => $selectedKnife, + 'displayKnife' => $this->getDisplayKnife($selectedSkins, $selectedKnife, $knifes) + ]; + } + + private function getDisplayKnife($selectedSkins, $selectedKnife, $knifes): array + { + $skins = UtilsClass::skinsFromJson(); + + // Check for knife skin first + foreach ($selectedSkins as $defindex => $selectedSkin) { + if (UtilsClass::isKnifeDefindex($defindex) && isset($skins[$defindex][$selectedSkin['weapon_paint_id']])) { + return [ + 'data' => $skins[$defindex][$selectedSkin['weapon_paint_id']], + 'source' => 'skin' + ]; + } + } + + // Check for basic knife selection + if (!empty($selectedKnife)) { + foreach ($knifes as $knife) { + if ($selectedKnife[0]['knife'] === $knife['weapon_name']) { + return [ + 'data' => $knife, + 'source' => 'basic' + ]; + } + } + } + + // Default knife + return [ + 'data' => $knifes[0] ?? null, + 'source' => 'default' + ]; + } + + public function getOrganizedWeapons(): array + { + $weapons = UtilsClass::getWeaponsFromArray(); + $knifes = UtilsClass::getKnifeTypes(); + $categories = UtilsClass::getWeaponCategories(); + + $organized = [ + 'Knives' => [], + 'Gloves' => [] + ]; + + // Add weapon categories + foreach ($categories as $categoryName => $weaponIds) { + $organized[$categoryName] = []; + foreach ($weaponIds as $weaponId) { + if (isset($weapons[$weaponId])) { + $organized[$categoryName][$weaponId] = $weapons[$weaponId]; + } + } + } + + // Add knives (exclude default) + foreach ($knifes as $knifeId => $knife) { + if ($knifeId !== 0) { + $organized['Knives'][$knifeId] = $knife; + } + } + + // Remove empty categories + return array_filter($organized, function($category) { + return !empty($category); + }); + } +} \ No newline at end of file diff --git a/website/index.php b/website/index.php index a8a3869e..d6a4d83e 100644 --- a/website/index.php +++ b/website/index.php @@ -3,266 +3,518 @@ require_once 'class/config.php'; require_once 'class/database.php'; require_once 'steamauth/steamauth.php'; require_once 'class/utils.php'; +require_once 'class/weapon_handler.php'; -$db = new DataBase(); -if (isset($_SESSION['steamid'])) { - - $steamid = $_SESSION['steamid']; - - $weapons = UtilsClass::getWeaponsFromArray(); - $skins = UtilsClass::skinsFromJson(); - $querySelected = $db->select(" - SELECT `weapon_defindex`, MAX(`weapon_paint_id`) AS `weapon_paint_id`, MAX(`weapon_wear`) AS `weapon_wear`, MAX(`weapon_seed`) AS `weapon_seed` - FROM `wp_player_skins` - WHERE `steamid` = :steamid - GROUP BY `weapon_defindex`, `steamid` - ", ["steamid" => $steamid]); - $selectedSkins = UtilsClass::getSelectedSkins($querySelected); - $selectedKnife = $db->select("SELECT * FROM `wp_player_knife` WHERE `wp_player_knife`.`steamid` = :steamid LIMIT 1", ["steamid" => $steamid]); - $knifes = UtilsClass::getKnifeTypes(); - - if (isset($_POST['forma'])) { - $ex = explode("-", $_POST['forma']); - - if ($ex[0] == "knife") { - $db->query("INSERT INTO `wp_player_knife` (`steamid`, `knife`, `weapon_team`) VALUES(:steamid, :knife, 2) ON DUPLICATE KEY UPDATE `knife` = :knife", ["steamid" => $steamid, "knife" => $knifes[$ex[1]]['weapon_name']]); - $db->query("INSERT INTO `wp_player_knife` (`steamid`, `knife`, `weapon_team`) VALUES(:steamid, :knife, 3) ON DUPLICATE KEY UPDATE `knife` = :knife", ["steamid" => $steamid, "knife" => $knifes[$ex[1]]['weapon_name']]); - } else { - if (array_key_exists($ex[1], $skins[$ex[0]]) && isset($_POST['wear']) && $_POST['wear'] >= 0.00 && $_POST['wear'] <= 1.00 && isset($_POST['seed'])) { - $wear = floatval($_POST['wear']); // wear - $seed = intval($_POST['seed']); // seed - if (array_key_exists($ex[0], $selectedSkins)) { - $db->query("UPDATE wp_player_skins SET weapon_paint_id = :weapon_paint_id, weapon_wear = :weapon_wear, weapon_seed = :weapon_seed WHERE steamid = :steamid AND weapon_defindex = :weapon_defindex", ["steamid" => $steamid, "weapon_defindex" => $ex[0], "weapon_paint_id" => $ex[1], "weapon_wear" => $wear, "weapon_seed" => $seed]); - } else { - $db->query("INSERT INTO wp_player_skins (`steamid`, `weapon_defindex`, `weapon_paint_id`, `weapon_wear`, `weapon_seed`, `weapon_team`) VALUES (:steamid, :weapon_defindex, :weapon_paint_id, :weapon_wear, :weapon_seed, 2)", ["steamid" => $steamid, "weapon_defindex" => $ex[0], "weapon_paint_id" => $ex[1], "weapon_wear" => $wear, "weapon_seed" => $seed]); - $db->query("INSERT INTO wp_player_skins (`steamid`, `weapon_defindex`, `weapon_paint_id`, `weapon_wear`, `weapon_seed`, `weapon_team`) VALUES (:steamid, :weapon_defindex, :weapon_paint_id, :weapon_wear, :weapon_seed, 3)", ["steamid" => $steamid, "weapon_defindex" => $ex[0], "weapon_paint_id" => $ex[1], "weapon_wear" => $wear, "weapon_seed" => $seed]); - } - } - } +// Handle weapon updates +if (isset($_SESSION['steamid']) && isset($_POST['forma'])) { + $weaponHandler = new WeaponHandler($_SESSION['steamid']); + if ($weaponHandler->handleWeaponUpdate($_POST)) { header("Location: {$_SERVER['PHP_SELF']}"); + exit; } } + +// Get loadout data for logged in users +$loadoutData = null; +$weaponCategories = []; +if (isset($_SESSION['steamid'])) { + require_once 'steamauth/userInfo.php'; + $weaponHandler = new WeaponHandler($_SESSION['steamid']); + $loadoutData = $weaponHandler->getLoadoutData(); + $weaponCategories = $weaponHandler->getOrganizedWeapons(); +} ?> -> +
- - - - + -Connect your Steam account to customize your weapon loadout
+ +