diff --git a/auth.php b/auth.php index d6099da..33cc2e1 100644 --- a/auth.php +++ b/auth.php @@ -29,11 +29,27 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { $error = 'Ce nom d\'utilisateur ou cet email est déjà utilisé.'; } else { $hashed_password = password_hash($password, PASSWORD_DEFAULT); - $stmt = $db->prepare("INSERT INTO users (username, email, password) VALUES (?, ?, ?)"); + try { + $db->beginTransaction(); + + $stmt = $db->prepare("INSERT INTO users (username, email, password) VALUES (?, ?, ?)"); $stmt->execute([$username, $email, $hashed_password]); + $new_user_id = $db->lastInsertId(); + + // Initialize resources for the new user + $resources = $db->query("SELECT id, slug FROM game_resources")->fetchAll(PDO::FETCH_ASSOC); + $res_stmt = $db->prepare("INSERT INTO user_resources (user_id, resource_id, amount) VALUES (?, ?, ?)"); + + foreach ($resources as $resource) { + $initialAmount = ($resource['slug'] === 'res_xp') ? 1 : 0; + $res_stmt->execute([$new_user_id, $resource['id'], $initialAmount]); + } + + $db->commit(); $success = 'Compte créé avec succès ! Vous pouvez maintenant vous connecter.'; } catch (Exception $e) { + $db->rollBack(); $error = 'Erreur lors de la création du compte.'; } } @@ -166,4 +182,4 @@ $page = $_GET['page'] ?? 'login'; Retour à la galaxie - + \ No newline at end of file diff --git a/db/migrate_user_resources.php b/db/migrate_user_resources.php new file mode 100644 index 0000000..8f76166 --- /dev/null +++ b/db/migrate_user_resources.php @@ -0,0 +1,42 @@ +exec("CREATE TABLE IF NOT EXISTS user_resources ( + user_id INT NOT NULL, + resource_id INT NOT NULL, + amount BIGINT UNSIGNED NOT NULL DEFAULT 0, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (user_id, resource_id), + FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE, + FOREIGN KEY (resource_id) REFERENCES game_resources(id) ON DELETE CASCADE + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;"); + + echo "Table user_resources created (if it did not exist).\n"; + + // 2. Get all users and all resources + $users = $db->query("SELECT id FROM users")->fetchAll(PDO::FETCH_COLUMN); + $resources = $db->query("SELECT id, slug FROM game_resources")->fetchAll(PDO::FETCH_ASSOC); + + if (empty($users) || empty($resources)) { + echo "No users or resources found to initialize.\n"; + } else { + // 3. Initialize resources for each user + $stmt = $db->prepare("INSERT IGNORE INTO user_resources (user_id, resource_id, amount) VALUES (?, ?, ?)"); + + foreach ($users as $userId) { + foreach ($resources as $resource) { + $initialAmount = ($resource['slug'] === 'res_xp') ? 1 : 0; + $stmt->execute([$userId, $resource['id'], $initialAmount]); + } + } + echo "Resources initialized for " . count($users) . " users.\n"; + } + + echo "Migration completed successfully.\n"; +} catch (PDOException $e) { + die("Migration failed: " . $e->getMessage() . "\n"); +} + diff --git a/index.php b/index.php index 45486b7..9fc57fe 100644 --- a/index.php +++ b/index.php @@ -6,11 +6,36 @@ $db = db(); $user_role = 'user'; if (isset($_SESSION['user_id'])) { - $stmt = $db->prepare("SELECT role FROM users WHERE id = ?"); + $stmt = $db->prepare("SELECT u.role, u.display_name, u.username, l.name as level_raw + FROM users u + LEFT JOIN levels l ON u.level_id = l.id + WHERE u.id = ?"); $stmt->execute([$_SESSION['user_id']]); $u_data = $stmt->fetch(); - $stmt = $db->prepare("SELECT u.level, u.grade, g.name as grade_name, g.image_url as grade_image FROM users u LEFT JOIN grades g ON u.grade = g.slug WHERE u.id = ?"); $stmt->execute([$_SESSION["user_id"]]); $extra = $stmt->fetch(); $_SESSION["level"] = $extra["level"]; $_SESSION["grade_name"] = $extra["grade_name"]; $_SESSION["grade_image"] = $extra["grade_image"]; - $user_role = $u_data['role'] ?? 'user'; + + if ($u_data) { + $user_role = $u_data['role'] ?? 'user'; + $_SESSION['display_name'] = $u_data['display_name'] ?: $u_data['username']; + $level_num = (int)filter_var($u_data['level_raw'], FILTER_SANITIZE_NUMBER_INT); + $_SESSION['level'] = $level_num; + + $grade_type = ($user_role === 'admin') ? 'admin' : 'utilisateur'; + $g_stmt = $db->prepare("SELECT name, image_url FROM grades + WHERE user_type = ? + AND (min_level <= ? OR min_level IS NULL) + AND (max_level >= ? OR max_level IS NULL) + LIMIT 1"); + $g_stmt->execute([$grade_type, $level_num, $level_num]); + $grade_data = $g_stmt->fetch(); + + if ($grade_data) { + $_SESSION['grade_name'] = $grade_data['name']; + $_SESSION['grade_image'] = $grade_data['image_url']; + } else { + $_SESSION['grade_name'] = "Recrue"; + $_SESSION['grade_image'] = "assets/images/placeholder_grade.png"; + } + } } $view = isset($_GET['view']) ? $_GET['view'] : 'sector'; @@ -37,9 +62,38 @@ $factions_map = []; foreach($factions_db as $f) $factions_map[$f['id']] = $f; // Grid size: 6x6 = 36 slots per sector $grid_size = 36; -// Mock Resources -$header_resources = $db->query("SELECT * FROM game_resources WHERE show_in_header = 1 ORDER BY CASE WHEN name = 'Crédits' THEN 1 WHEN name = 'Materials' THEN 2 WHEN name = 'Energie' THEN 3 WHEN name = 'Données' THEN 4 ELSE 5 END ASC, name ASC")->fetchAll(PDO::FETCH_ASSOC); -$resources = []; foreach($header_resources as $hr) { $resources[$hr["name"]] = ["val" => "0", "prod" => "", "icon" => $hr["icon"] ?: "fa-gem", "image" => $hr["image_url"]]; } +// Dynamic Resources +$resources = []; +if (isset($_SESSION['user_id'])) { + $stmt = $db->prepare(" + SELECT gr.*, COALESCE(ur.amount, 0) as amount + FROM game_resources gr + LEFT JOIN user_resources ur ON gr.id = ur.resource_id AND ur.user_id = ? + WHERE gr.show_in_header = 1 + ORDER BY CASE + WHEN gr.name = 'Crédits' THEN 1 + WHEN gr.name = 'Materials' THEN 2 + WHEN gr.name = 'Energie' THEN 3 + WHEN gr.name = 'Données' THEN 4 + ELSE 5 + END ASC, gr.name ASC + "); + $stmt->execute([$_SESSION['user_id']]); + $header_resources = $stmt->fetchAll(PDO::FETCH_ASSOC); + foreach($header_resources as $hr) { + $resources[$hr["name"]] = [ + "val" => (string)$hr["amount"], + "prod" => "", + "icon" => $hr["icon"] ?: "fa-gem", + "image" => $hr["image_url"] + ]; + } +} else { + $header_resources = $db->query("SELECT * FROM game_resources WHERE show_in_header = 1 ORDER BY CASE WHEN name = 'Crédits' THEN 1 WHEN name = 'Materials' THEN 2 WHEN name = 'Energie' THEN 3 WHEN name = 'Données' THEN 4 ELSE 5 END ASC, name ASC")->fetchAll(PDO::FETCH_ASSOC); + foreach($header_resources as $hr) { + $resources[$hr["name"]] = ["val" => "0", "prod" => "", "icon" => $hr["icon"] ?: "fa-gem", "image" => $hr["image_url"]]; + } +} if ($view === 'sector') { $stmt = $db->prepare("SELECT * FROM planets WHERE galaxy_id = ? AND sector_id = ? AND slot BETWEEN 1 AND ?"); @@ -941,15 +995,16 @@ function getStatusColor($status, $statuses_map) {

Profil Public

-