diff --git a/db/add_recruitment_status_to_guilds.php b/db/add_recruitment_status_to_guilds.php new file mode 100644 index 0000000..1427ae1 --- /dev/null +++ b/db/add_recruitment_status_to_guilds.php @@ -0,0 +1,17 @@ +query("SHOW COLUMNS FROM guilds LIKE 'recruitment_status'"); + if (!$stmt->fetch()) { + $db->exec("ALTER TABLE guilds ADD COLUMN recruitment_status ENUM('ouvert', 'validation', 'ferme') DEFAULT 'ouvert'"); + echo "Column 'recruitment_status' added to 'guilds' table.\n"; + } else { + echo "Column 'recruitment_status' already exists.\n"; + } +} catch (Exception $e) { + echo "Error: " . $e->getMessage() . "\n"; +} + diff --git a/guilde.php b/guilde.php index bc588ec..d0ba9ea 100644 --- a/guilde.php +++ b/guilde.php @@ -92,7 +92,7 @@ foreach($all_resources_raw as $hr) { // --- 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 +$stmt = $db->prepare("SELECT u.guild_id, m.role, g.name as guild_name, g.tag as guild_tag, g.description as guild_desc, g.recruitment_status FROM users u LEFT JOIN guild_members m ON u.id = m.user_id LEFT JOIN guilds g ON u.guild_id = g.id @@ -111,14 +111,23 @@ $member_limit = (int)($stmt->fetchColumn() ?: 50); // 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 = $db->prepare("SELECT recruitment_status, (SELECT COUNT(*) FROM guild_members WHERE guild_id = g.id) as current_members FROM guilds g WHERE id = ?"); $stmt->execute([$guild_id]); - $current_members = (int)$stmt->fetchColumn(); - if ($current_members >= $member_limit) { $error = "Cette guilde est pleine."; } else { + $g_info = $stmt->fetch(); + + if (!$g_info) { + $error = "Guilde introuvable."; + } elseif ($g_info['current_members'] >= $member_limit) { + $error = "Cette guilde est pleine."; + } elseif ($g_info['recruitment_status'] === 'ferme') { + $error = "Le recrutement de cette guilde est fermé."; + } else { $db->beginTransaction(); try { + $target_role = ($g_info['recruitment_status'] === 'validation') ? 'en attente' : 'membre'; + $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]); + $db->prepare("INSERT INTO guild_members (guild_id, user_id, role) VALUES (?, ?, ?)")->execute([$guild_id, $user_id, $target_role]); $_SESSION['guild_id'] = $guild_id; $db->commit(); header("Location: guilde.php"); @@ -127,6 +136,20 @@ if (isset($_GET['join']) && !$in_guild) { } } +// ACCEPT/REFUSE MEMBER (Validation) +if (isset($_GET['validate']) && $in_guild && ($user_guild_info['role'] === 'superviseur' || $user_guild_info['role'] === 'officier')) { + $target_id = (int)$_GET['validate']; + $action = $_GET['action_type'] ?? ''; + if ($action === 'accept') { + $db->prepare("UPDATE guild_members SET role = 'membre' WHERE user_id = ? AND guild_id = ? AND role = 'en attente'")->execute([$target_id, $user_guild_info['guild_id']]); + $message = "Membre accepté."; + } elseif ($action === 'refuse') { + $db->prepare("UPDATE users SET guild_id = NULL WHERE id = ?")->execute([$target_id]); + $db->prepare("DELETE FROM guild_members WHERE user_id = ? AND guild_id = ?")->execute([$target_id, $user_guild_info['guild_id']]); + $message = "Demande refusée."; + } +} + // DISBAND GUILD if (isset($_GET['action']) && $_GET['action'] === 'disband' && $in_guild && $user_guild_info['role'] === 'superviseur') { $guild_id = $user_guild_info['guild_id']; @@ -163,7 +186,7 @@ if (isset($_GET['kick']) && $in_guild && ($user_guild_info['role'] === 'supervis $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'); + $can_kick = ($user_guild_info['role'] === 'superviseur') || ($user_guild_info['role'] === 'officier' && in_array($target_role, ['membre', 'en attente'])); 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]); @@ -191,6 +214,16 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST[' $message = "Description de la guilde mise à jour."; } +// UPDATE RECRUITMENT STATUS +if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'update_recruitment_status' && $in_guild && ($user_guild_info['role'] === 'superviseur' || $user_guild_info['role'] === 'officier')) { + $new_status = $_POST['recruitment_status']; + if (in_array($new_status, ['ouvert', 'validation', 'ferme'])) { + $db->prepare("UPDATE guilds SET recruitment_status = ? WHERE id = ?")->execute([$new_status, $user_guild_info['guild_id']]); + $user_guild_info['recruitment_status'] = $new_status; + $message = "Statut de recrutement mis à jour."; + } +} + // CREATE GUILD if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'create_guild' && !$in_guild) { $name = trim($_POST['name']); @@ -211,7 +244,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST[' 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]); + $db->prepare("INSERT INTO guilds (name, tag, description, recruitment_status) VALUES (?, ?, ?, 'ouvert')")->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]); @@ -227,7 +260,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST[' // --- 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 = $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', 'en attente'), m.joined_at ASC"); $stmt->execute([$user_guild_info['guild_id']]); $guild_members = $stmt->fetchAll(PDO::FETCH_ASSOC); } else { @@ -337,6 +370,7 @@ if ($in_guild) { .role-superviseur { background: #ebcb8b; color: #000; } .role-officier { background: #81a1c1; color: #fff; } .role-membre { background: #4c566a; color: #fff; } + .role-en-attente { background: #bf616a; color: #fff; } .req-item { background: #1a202c; padding: 8px 12px; border: 1px solid #2d3545; display: inline-flex; align-items: center; gap: 8px; border-radius: 4px; margin-right: 10px; margin-bottom: 10px;} .req-item img { width: 18px; height: 18px; } .req-item.insufficient { border-color: #bf616a; color: #bf616a; } @@ -433,10 +467,10 @@ if ($in_guild) {
| Guilde | Membres | Actions | |
|---|---|---|---|
| Guilde | Membres | Recrutement | Actions |
| Aucune guilde pour le moment. | |||
| Aucune guilde pour le moment. | |||
| / | - - Rejoindre + + OUVERT + + SUR VALIDATION + FERMÉ + + | ++ + + = $member_limit): ?> PLEINE + + - | |