From b27feb7780d48c312894d2be4427ae6102a6947d Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Mon, 9 Mar 2026 11:26:56 +0000 Subject: [PATCH] Alpha V2.5.12 --- guilde.php | 659 ++++++++++++++++++++++++++++++++++++---------------- profile.php | 80 ++++--- 2 files changed, 497 insertions(+), 242 deletions(-) diff --git a/guilde.php b/guilde.php index 09a2d8b..15688e1 100644 --- a/guilde.php +++ b/guilde.php @@ -5,76 +5,64 @@ 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 = ''; -// 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 +// --- 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 FROM users u - LEFT JOIN guilds g ON u.guild_id = g.id + 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 WHERE u.id = ?"); $stmt->execute([$user_id]); -$user = $stmt->fetch(); +$u_data = $stmt->fetch(); -$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']); +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']; - if (empty($name) || empty($tag)) { - $error = "Le nom et le tag sont obligatoires."; + $_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']; } else { - 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(); - } + $_SESSION['grade_name'] = "Recrue"; + $_SESSION['grade_image'] = "assets/images/placeholder_grade.png"; } } -// 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) +// Dynamic Resources for Header & Check $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 @@ -84,53 +72,262 @@ $stmt = $db->prepare(" END ASC, gr.name ASC "); $stmt->execute([$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"] - ]; +$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"] + ]; + } } + +// --- 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, l.name as level_raw 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 FIELD(m.role, 'superviseur', 'officier', 'membre'), m.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; + } + } +} + ?> - Nexus - Guilde + <?php echo $in_guild ? htmlspecialchars($user_guild_info['guild_name']) : 'Guildes'; ?> - Nexus -
-
- Bienvenue, @ - Retour au Nexus - Déconnexion -
-
- $res): ?> -
-
- - ?v="> +
+
+ +
+ + 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

+ + +
+ + + +
+ + +
+
+ +
+
+
+ +
+
+
- " style="color: #88c0d0;"> +
+
+ [] +

+
+
Votre grade :
+
+ +
+ +
+ +

Membres de la Guilde ( / )

+ + + + + + + + + + + + + + + + +
NiveauMembreGradeAnciennetéGestion
+ + @ + + + + + +
+ + + +
+ + + + + +
+ +
-
-
- -
- -
-
+ + -
- -
-
- - [] -
- - - - - - - - - - - - - - - - - - - - -
NiveauMembreRangDate d'arrivée
- - - - - - - - - - - -
-
- -
-
- - Fonder une nouvelle guilde -
- -
- -
-
- - -
-
- - -
- -
-
- -
- - -