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
+ - Nexus
-
-
-
- $res): ?>
-
-
-
-

?v=">
+
+
+
+
+
+ $res): ?>
+
+
+
+

?v=">
+
+
">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Guildes Actives
+
+ | Guilde | Membres | Actions |
+
+
+ | Aucune guilde pour le moment. |
+
+
+
+
+ []
+
+
+ |
+ / |
+
+
+ Rejoindre
+
+ PLEINE
+
+ |
+
+
+
+
+
+
+
+
+
Fonder une Guilde
+
+
Coût requis :
+
Gratuit
+
+
+
+
; ?>)
+
+
+
+
+
+
+
+
+
-
" style="color: #88c0d0;">
+
+
+ []
+
+
+
Votre grade :
+
+
+
+
+
+
+
Membres de la Guilde ( / )
+
+ | Niveau | Membre | Grade | Ancienneté | Gestion |
+
+
+
+
+ |
+
+
+ @
+
+
+ |
+ |
+ |
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
-
-
-
-
+
+
-
-
-
-
-
- []
-
-
-
-
-
- | Niveau |
- Membre |
- Rang |
- Date d'arrivée |
-
-
-
-
-
- |
-
- |
-
-
-
-
- |
-
-
-
-
- |
-
-
- |
-
-
-
-
-
-
-
-
-
- Fonder une nouvelle guilde
-
-
-
-
-
-
-
-
-
-
-
+
+
@@ -297,7 +558,7 @@ foreach($header_resources as $hr) {
const modal = document.getElementById('profileModal');
const content = document.getElementById('profileModalContent');
- content.innerHTML = '
';
+ content.innerHTML = '
Chargement des données...
';
modal.style.display = 'flex';
fetch(`profile.php?id=${userId}`, {
@@ -308,14 +569,10 @@ foreach($header_resources as $hr) {
content.innerHTML = html;
})
.catch(error => {
- content.innerHTML = '
Erreur lors du chargement du profil.
';
+ content.innerHTML = '
Erreur de connexion au Nexus.
';
console.error('Error:', error);
});
}
-
- function closeProfileModal() {
- document.getElementById('profileModal').style.display = 'none';
- }
-
+