diff --git a/admin.php b/admin.php index b206ca4..5894eaf 100644 --- a/admin.php +++ b/admin.php @@ -55,6 +55,61 @@ $tab = isset($_GET['tab']) ? $_GET['tab'] : 'project_logs'; // --- HANDLERS --- +// Handle Player Resource Management +if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'admin_manage_player_resources') { + $target_type = $_POST['target_type']; // 'single', 'multiple', 'all' + $player_ids = []; + + if ($target_type === 'all') { + $stmt = $db->query("SELECT id FROM users"); + $player_ids = $stmt->fetchAll(PDO::FETCH_COLUMN); + } else { + $player_ids = isset($_POST['player_ids']) ? (array)$_POST['player_ids'] : []; + } + + $resource_id = (int)$_POST['resource_id']; + $amount = (int)$_POST['amount']; + $operation = $_POST['operation']; // 'add', 'remove' + + if ($operation === 'remove') { + $amount = -abs($amount); + } else { + $amount = abs($amount); + } + + if (!empty($player_ids) && $resource_id > 0 && $amount !== 0) { + $db->beginTransaction(); + try { + $stmt_check = $db->prepare("SELECT amount FROM user_resources WHERE user_id = ? AND resource_id = ?"); + $stmt_insert = $db->prepare("INSERT INTO user_resources (user_id, resource_id, amount) VALUES (?, ?, ?)"); + $stmt_update = $db->prepare("UPDATE user_resources SET amount = GREATEST(0, amount + ?) WHERE user_id = ? AND resource_id = ?"); + + foreach ($player_ids as $pid) { + $pid = (int)$pid; + $stmt_check->execute([$pid, $resource_id]); + $exists = $stmt_check->fetch(); + + if ($exists) { + $stmt_update->execute([$amount, $pid, $resource_id]); + } else { + $initial_qty = max(0, $amount); + $stmt_insert->execute([$pid, $resource_id, $initial_qty]); + } + } + $db->commit(); + header("Location: admin.php?tab=player&success=1"); + exit; + } catch (Exception $e) { + $db->rollBack(); + header("Location: admin.php?tab=player&error=db"); + exit; + } + } else { + header("Location: admin.php?tab=player&error=missing_fields"); + exit; + } +} + // Handle User Role Update if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'update_user_role') { $target_user_id = (int)$_POST['target_user_id']; @@ -217,7 +272,7 @@ if ($_SERVER["REQUEST_METHOD"] === "POST" && isset($_POST["action"]) && $_POST[" $stmt = $db->prepare("UPDATE celestial_object_statuses SET name = ?, slug = ?, color = ?, description = ? WHERE id = ?"); $stmt->execute([$name, $slug, $color, $description, $id]); } else { - $stmt = $db->prepare("INSERT INTO celestial_object_statuses (name, slug, color, description) VALUES (?, ?, ?, ?)"); + $stmt = $db->prepare("INSERT INTO celestial_object_statuses (name, slug, color, description) VALUES (?, ?, ? , ?)"); $stmt->execute([$name, $slug, $color, $description]); } header("Location: admin.php?tab=statuses&success=1"); @@ -727,6 +782,9 @@ $guild_member_limit = 50; if ($tab === 'users') { $users_list = $db->query("SELECT id, username, email, role FROM users ORDER BY username ASC")->fetchAll(); +} elseif ($tab === 'player') { + $users_list = $db->query("SELECT id, username FROM users ORDER BY username ASC")->fetchAll(); + $resources_list = $db->query("SELECT id, name FROM game_resources ORDER BY name ASC")->fetchAll(); } elseif ($tab === 'objects') { $objects_list = $db->query("SELECT * FROM celestial_object_types ORDER BY name ASC")->fetchAll(); foreach ($objects_list as &$obj) { @@ -943,8 +1001,12 @@ elseif ($tab === "units") {
- +
Erreur : La quantité doit être un nombre strictement positif.
+ +
Erreur Base de Données : L'opération a échoué.
+ +
Erreur : Veuillez remplir tous les champs et sélectionner au moins un joueur.
Opération effectuée avec succès.
@@ -954,6 +1016,7 @@ elseif ($tab === "units") {
"> Journal de Bord Utilisateurs + Joueur Niveaux Grades Titres & Badges @@ -972,7 +1035,80 @@ elseif ($tab === "units") { Unité
- + +

Gestion des Joueurs (Gameplay)

+
+

Attribuer ou Retirer des Ressources

+
+ + +
+ + +
+ +
+ +
+
Choisir...
+
+ + + +
+
+
+ +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + + +

Gestion des Rôles

@@ -1948,7 +2084,7 @@ elseif ($tab === "units") { -
+
@@ -2873,4 +3009,4 @@ elseif ($tab === "units") { }); - + \ No newline at end of file diff --git a/assets/pasted-20260309-091019-3cc80021.png b/assets/pasted-20260309-091019-3cc80021.png new file mode 100644 index 0000000..0a05da6 Binary files /dev/null and b/assets/pasted-20260309-091019-3cc80021.png differ diff --git a/guilde.php b/guilde.php index 9012f8c..09a2d8b 100644 --- a/guilde.php +++ b/guilde.php @@ -5,64 +5,76 @@ session_start(); $db = db(); if (!isset($_SESSION['user_id'])) { - header("Location: auth.php"); + header('Location: auth.php'); exit; } $user_id = $_SESSION['user_id']; -$message = ''; -$error = ''; -// --- HEADER DATA FETCHING (from index.php) --- -$user_role = 'user'; -$stmt = $db->prepare("SELECT u.role, u.display_name, u.username, u.guild_id, l.name as level_raw, - u.selected_title_id, u.selected_badge_id, - t.name as title_name, - b.name as badge_name, b.image_url as badge_image +// Récupérer les informations de l'utilisateur +$stmt = $db->prepare("SELECT u.*, g.name as guild_name, g.owner_id as guild_owner_id FROM users u - LEFT JOIN levels l ON u.level_id = l.id - LEFT JOIN titles t ON u.selected_title_id = t.id - LEFT JOIN badges b ON u.selected_badge_id = b.id + LEFT JOIN guilds g ON u.guild_id = g.id WHERE u.id = ?"); $stmt->execute([$user_id]); -$u_data = $stmt->fetch(); +$user = $stmt->fetch(); -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; - $_SESSION['guild_id'] = $u_data['guild_id']; +$guild_id = $user['guild_id']; +$is_owner = ($guild_id && $user['id'] == $user['guild_owner_id']); + +// Gérer la création de guilde +$error = ''; +$success = ''; +if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['create_guild']) && !$guild_id) { + $name = trim($_POST['guild_name']); + $tag = trim($_POST['guild_tag']); - $_SESSION['selected_title_name'] = $u_data['title_name']; - $_SESSION['selected_badge_name'] = $u_data['badge_name']; - $_SESSION['selected_badge_image'] = $u_data['badge_image']; - - $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']; + if (empty($name) || empty($tag)) { + $error = "Le nom et le tag sont obligatoires."; } else { - $_SESSION['grade_name'] = "Recrue"; - $_SESSION['grade_image'] = "assets/images/placeholder_grade.png"; + try { + $db->beginTransaction(); + + $stmt = $db->prepare("INSERT INTO guilds (name, tag, owner_id) VALUES (?, ?, ?)"); + $stmt->execute([$name, $tag, $user_id]); + $new_guild_id = $db->lastInsertId(); + + $stmt = $db->prepare("UPDATE users SET guild_id = ? WHERE id = ?"); + $stmt->execute([$new_guild_id, $user_id]); + + $stmt = $db->prepare("INSERT INTO guild_members (guild_id, user_id, role) VALUES (?, ?, 'owner')"); + $stmt->execute([$new_guild_id, $user_id]); + + $db->commit(); + header('Location: guilde.php'); + exit; + } catch (Exception $e) { + $db->rollBack(); + $error = "Erreur lors de la création : " . $e->getMessage(); + } } } -// Dynamic Resources for Header & Check +// Récupérer les membres si en guilde +$members = []; +if ($guild_id) { + $stmt = $db->prepare("SELECT u.id, u.username, u.display_name, m.role, m.joined_at, l.name as level_name + FROM guild_members m + JOIN users u ON m.user_id = u.id + LEFT JOIN levels l ON u.level_id = l.id + WHERE m.guild_id = ? + ORDER BY CASE WHEN m.role = 'owner' THEN 1 WHEN m.role = 'officer' THEN 2 ELSE 3 END ASC, joined_at ASC"); + $stmt->execute([$guild_id]); + $members = $stmt->fetchAll(); +} + +// Ressources pour le header (copié de index.php) $resources = []; -$user_resource_amounts = []; // For easier access $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 LIKE 'Crédit%' THEN 1 WHEN gr.name LIKE 'Matériau%' THEN 2 @@ -72,432 +84,238 @@ $stmt = $db->prepare(" END ASC, gr.name ASC "); $stmt->execute([$user_id]); -$all_resources_raw = $stmt->fetchAll(PDO::FETCH_ASSOC); -foreach($all_resources_raw as $hr) { - $user_resource_amounts[$hr['id']] = (float)$hr['amount']; - if ($hr['show_in_header'] == 1) { - $resources[$hr["name"]] = [ - "val" => (string)$hr["amount"], - "prod" => "", - "icon" => $hr["icon"] ?: "fa-gem", - "image" => $hr["image_url"] - ]; - } +$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"] + ]; } - -// --- GUILD SPECIFIC LOGIC --- - -// Check if user is in a guild -$stmt = $db->prepare("SELECT u.guild_id, m.role, g.name as guild_name, g.tag as guild_tag, g.description as guild_desc - FROM users u - LEFT JOIN guild_members m ON u.id = m.user_id - LEFT JOIN guilds g ON u.guild_id = g.id - WHERE u.id = ?"); -$stmt->execute([$user_id]); -$user_guild_info = $stmt->fetch(PDO::FETCH_ASSOC); - -$in_guild = !empty($user_guild_info['guild_id']); - -// Fetch member limit -$stmt = $db->query("SELECT value FROM guild_restrictions WHERE restriction_key = 'member_limit'"); -$member_limit = (int)($stmt->fetchColumn() ?: 50); - -// --- ACTIONS --- - -// JOIN GUILD -if (isset($_GET['join']) && !$in_guild) { - $guild_id = (int)$_GET['join']; - $stmt = $db->prepare("SELECT COUNT(*) FROM guild_members WHERE guild_id = ?"); - $stmt->execute([$guild_id]); - $current_members = (int)$stmt->fetchColumn(); - if ($current_members >= $member_limit) { $error = "Cette guilde est pleine."; } else { - $db->beginTransaction(); - try { - $db->prepare("UPDATE users SET guild_id = ? WHERE id = ?")->execute([$guild_id, $user_id]); - $db->prepare("INSERT INTO guild_members (guild_id, user_id, role) VALUES (?, ?, 'membre')")->execute([$guild_id, $user_id]); - $_SESSION['guild_id'] = $guild_id; - $db->commit(); - header("Location: guilde.php"); - exit; - } catch (Exception $e) { $db->rollBack(); $error = "Erreur : " . $e->getMessage(); } - } -} - -// DISBAND GUILD -if (isset($_GET['action']) && $_GET['action'] === 'disband' && $in_guild && $user_guild_info['role'] === 'superviseur') { - $guild_id = $user_guild_info['guild_id']; - $db->beginTransaction(); - try { - $db->prepare("UPDATE users SET guild_id = NULL WHERE guild_id = ?")->execute([$guild_id]); - $db->prepare("DELETE FROM guild_members WHERE guild_id = ?")->execute([$guild_id]); - $db->prepare("DELETE FROM guilds WHERE id = ?")->execute([$guild_id]); - $_SESSION['guild_id'] = null; - $db->commit(); - header("Location: guilde.php"); - exit; - } catch (Exception $e) { $db->rollBack(); $error = "Erreur : " . $e->getMessage(); } -} - -// LEAVE GUILD -if (isset($_GET['action']) && $_GET['action'] === 'leave' && $in_guild && $user_guild_info['role'] !== 'superviseur') { - $db->beginTransaction(); - try { - $db->prepare("UPDATE users SET guild_id = NULL WHERE id = ?")->execute([$user_id]); - $db->prepare("DELETE FROM guild_members WHERE user_id = ?")->execute([$user_id]); - $_SESSION['guild_id'] = null; - $db->commit(); - header("Location: guilde.php"); - exit; - } catch (Exception $e) { $db->rollBack(); $error = "Erreur : " . $e->getMessage(); } -} - -// KICK MEMBER -if (isset($_GET['kick']) && $in_guild && ($user_guild_info['role'] === 'superviseur' || $user_guild_info['role'] === 'officier')) { - $target_id = (int)$_GET['kick']; - if ($target_id != $user_id) { - $stmt = $db->prepare("SELECT role FROM guild_members WHERE user_id = ? AND guild_id = ?"); - $stmt->execute([$target_id, $user_guild_info['guild_id']]); - $target_role = $stmt->fetchColumn(); - if ($target_role) { - $can_kick = ($user_guild_info['role'] === 'superviseur') || ($user_guild_info['role'] === 'officier' && $target_role === 'membre'); - if ($can_kick) { - $db->prepare("UPDATE users SET guild_id = NULL WHERE id = ?")->execute([$target_id]); - $db->prepare("DELETE FROM guild_members WHERE user_id = ?")->execute([$target_id]); - $message = "Membre exclu."; - } else $error = "Droits insuffisants."; - } - } -} - -// UPDATE ROLE -if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'update_role' && $in_guild && $user_guild_info['role'] === 'superviseur') { - $target_id = (int)$_POST['target_user_id']; - $new_role = $_POST['new_role']; - if (in_array($new_role, ['membre', 'officier']) && $target_id != $user_id) { - $db->prepare("UPDATE guild_members SET role = ? WHERE user_id = ? AND guild_id = ?")->execute([$new_role, $target_id, $user_guild_info['guild_id']]); - $message = "Grade mis à jour."; - } -} - -// CREATE GUILD -if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'create_guild' && !$in_guild) { - $name = trim($_POST['name']); - $tag = strtoupper(trim($_POST['tag'])); - $description = trim($_POST['description']); - if (strlen($name) < 3) $error = "Nom trop court."; - elseif (strlen($tag) < 2) $error = "Tag trop court."; - else { - $reqs = $db->query("SELECT resource_id, amount FROM guild_creation_requirements WHERE amount > 0")->fetchAll(PDO::FETCH_ASSOC); - $db->beginTransaction(); - try { - $can_afford = true; - foreach ($reqs as $req) { - $stmt = $db->prepare("SELECT amount FROM user_resources WHERE user_id = ? AND resource_id = ?"); - $stmt->execute([$user_id, $req['resource_id']]); - if (($stmt->fetchColumn() ?: 0) < $req['amount']) { $can_afford = false; break; } - } - if (!$can_afford) { $error = "Ressources insuffisantes."; $db->rollBack(); } - else { - foreach ($reqs as $req) $db->prepare("UPDATE user_resources SET amount = amount - ? WHERE user_id = ? AND resource_id = ?")->execute([$req['amount'], $user_id, $req['resource_id']]); - $db->prepare("INSERT INTO guilds (name, tag, description) VALUES (?, ?, ?)")->execute([$name, $tag, $description]); - $guild_id = $db->lastInsertId(); - $db->prepare("INSERT INTO guild_members (guild_id, user_id, role) VALUES (?, ?, 'superviseur')")->execute([$guild_id, $user_id]); - $db->prepare("UPDATE users SET guild_id = ? WHERE id = ?")->execute([$guild_id, $user_id]); - $_SESSION['guild_id'] = $guild_id; - $db->commit(); - header("Location: guilde.php"); - exit; - } - } catch (Exception $e) { $db->rollBack(); $error = "Erreur : " . $e->getMessage(); } - } -} - -// --- DATA FETCHING --- - -if ($in_guild) { - $stmt = $db->prepare("SELECT m.*, u.username, u.display_name FROM guild_members m JOIN users u ON m.user_id = u.id WHERE m.guild_id = ? ORDER BY FIELD(role, 'superviseur', 'officier', 'membre'), joined_at ASC"); - $stmt->execute([$user_guild_info['guild_id']]); - $guild_members = $stmt->fetchAll(PDO::FETCH_ASSOC); -} else { - $display_reqs = $db->query("SELECT r.id, r.name, r.icon, r.image_url, gr.amount FROM guild_creation_requirements gr JOIN game_resources r ON gr.resource_id = r.id WHERE gr.amount > 0")->fetchAll(PDO::FETCH_ASSOC); - $all_guilds = $db->query("SELECT g.*, (SELECT COUNT(*) FROM guild_members WHERE guild_id = g.id) as member_count FROM guilds g ORDER BY member_count DESC")->fetchAll(PDO::FETCH_ASSOC); - - // Check global affordability for create button - $can_afford_creation = true; - foreach ($display_reqs as $req) { - if (($user_resource_amounts[$req['id']] ?? 0) < $req['amount']) { - $can_afford_creation = false; - break; - } - } -} - ?> - <?php echo $in_guild ? htmlspecialchars($user_guild_info['guild_name']) : 'Guildes'; ?> - Nexus + Nexus - Guilde -
-
-
- Retour au Nexus - - - -
-
- - Bienvenue, @ - Journal Mon compte - Déconnexion - -
-
- $res): ?> -
-
- - ?v="> - - "> - -
-
-
-
- - -
-
-
- -
-
- -
-
-
-
- -
- -
- -
-

Guildes Actives

-
- - - - - - - - - - - - - -
GuildeMembresActions
Aucune guilde pour le moment.
- [] -
- -
/ - - Rejoindre - - PLEINE - -
-
- - -
-

Fonder une Guilde

-
-

Coût requis :

-

Gratuit

- - -
- - - -
- - -
-
- -
-
-
- -
-
- +
+
+ Bienvenue, @ + Retour au Nexus + Déconnexion +
+
+ $res): ?> +
+
+ + ?v="> -
-
- [] -

-
-
Votre grade :
-
- -
- -
- -

Membres de la Guilde ( / )

- - - - - - - - - - - - - - -
MembreGradeAnciennetéGestion
- - @ - - - - - -
- - - -
- - - - - -
- -
- - Dissoudre la guilde - - Quitter la guilde - -
+ " style="color: #88c0d0;">
+
+
+ +
- + +
+
+ +
+ +
+
+ + [] +
+ + + + + + + + + + + + + + + + + + + + +
NiveauMembreRangDate d'arrivée
+ + + + + + + + + + + +
+
+ +
+
+ + Fonder une nouvelle guilde +
+ +
+ +
+
+ + +
+
+ + +
+ +
+
+ +
+ + + + + diff --git a/profile.php b/profile.php index 5afa940..c44d464 100644 --- a/profile.php +++ b/profile.php @@ -1,49 +1,169 @@ prepare("SELECT username, display_name, level, grade FROM users WHERE username = ?"); - $stmt->execute([$username]); + +if ($id || !empty($username)) { + // Fetch full user data matching the header logic in index.php + $sql = "SELECT u.id, u.role, u.display_name, u.username, u.guild_id, l.name as level_raw, + u.selected_title_id, u.selected_badge_id, + t.name as title_name, + b.name as badge_name, b.image_url as badge_image, + g.name as guild_name, g.tag as guild_tag + FROM users u + LEFT JOIN levels l ON u.level_id = l.id + LEFT JOIN titles t ON u.selected_title_id = t.id + LEFT JOIN badges b ON u.selected_badge_id = b.id + LEFT JOIN guilds g ON u.guild_id = g.id + WHERE " . ($id ? "u.id = ?" : "(u.username = ? OR u.display_name = ?)"); + + $stmt = $db->prepare($sql); + $params = $id ? [$id] : [$username, $username]; + $stmt->execute($params); $user = $stmt->fetch(); + + if ($user) { + $level_num = (int)filter_var($user['level_raw'] ?? '1', FILTER_SANITIZE_NUMBER_INT); + $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(); + + $user['grade_name'] = $grade_data['name'] ?? "Recrue"; + $user['grade_image'] = $grade_data['image_url'] ?? "assets/images/placeholder_grade.png"; + $user['level_num'] = $level_num ?: 1; + } } -?> + +if ($is_ajax): ?> +
+ +
+ + + + + +
+ + +
+ « » +
+ + +
+ Niveau +
+ + +
+ + [] + +
+ + + +
+ +
Badge Équipé
+
+ + + +
+ +

Joueur introuvable

+
+ +
+ - - Profil Joueur - Nexus + Profil de <?php echo $user ? htmlspecialchars($user['display_name'] ?: $user['username']) : 'Joueur'; ?> - Nexus + -
+
-

Profil de

-
Identifiant @
-
Niveau
-
Grade
+ Grade + +

+ @ + + +
« »
+ + +
NIVEAU
+ + +
+
+ + [] + +
+ + + +
+
+ +
Badge de prestige
+
+
+ + -

Joueur introuvable

-

Le profil demandé n'existe pas ou a été supprimé.

+
+ +

Joueur introuvable

+

Le profil de @ n'a pas été localisé dans la base de données du Nexus.

+
- + Retour au Nexus