Alpha V2.5.15

This commit is contained in:
Flatlogic Bot 2026-03-10 22:58:05 +00:00
parent 2e517f9a99
commit c4765c0e6f
2 changed files with 114 additions and 26 deletions

View File

@ -0,0 +1,17 @@
<?php
require_once __DIR__ . '/config.php';
$db = db();
try {
// Check if column exists
$stmt = $db->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";
}

View File

@ -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) {
<div style="flex: 2; min-width: 300px;">
<h2><i class="fa-solid fa-list"></i> Guildes Actives</h2>
<table class="guild-table">
<thead><tr><th>Guilde</th><th>Membres</th><th>Actions</th></tr></thead>
<thead><tr><th>Guilde</th><th>Membres</th><th>Recrutement</th><th>Actions</th></tr></thead>
<tbody>
<?php if (empty($all_guilds)): ?>
<tr><td colspan="3" style="text-align:center; color:#8c92a3;">Aucune guilde pour le moment.</td></tr>
<tr><td colspan="4" style="text-align:center; color:#8c92a3;">Aucune guilde pour le moment.</td></tr>
<?php endif; ?>
<?php foreach ($all_guilds as $g): ?>
<tr>
@ -447,10 +481,21 @@ if ($in_guild) {
</td>
<td><?php echo $g['member_count']; ?> / <?php echo $member_limit; ?></td>
<td>
<?php if ($g['member_count'] < $member_limit): ?>
<a href="?join=<?php echo $g['id']; ?>" class="btn btn-join">Rejoindre</a>
<?php if ($g['recruitment_status'] === 'ouvert'): ?>
<span style="color:#a3be8c; font-size:11px; font-weight:bold;">OUVERT</span>
<?php elseif ($g['recruitment_status'] === 'validation'): ?>
<span style="color:#ebcb8b; font-size:11px; font-weight:bold;">SUR VALIDATION</span>
<?php else: ?>
<span style="color:#bf616a; font-size:11px; font-weight:bold;">FERMÉ</span>
<?php endif; ?>
</td>
<td>
<?php if ($g['member_count'] < $member_limit && $g['recruitment_status'] !== 'ferme'): ?>
<a href="?join=<?php echo $g['id']; ?>" class="btn btn-join"><?php echo $g['recruitment_status'] === 'validation' ? 'Postuler' : 'Rejoindre'; ?></a>
<?php elseif ($g['member_count'] >= $member_limit): ?>
<span style="color:#bf616a; font-size:11px; font-weight:bold;">PLEINE</span>
<?php else: ?>
<span style="color:#bf616a; font-size:11px; font-weight:bold;">-</span>
<?php endif; ?>
</td>
</tr>
@ -495,7 +540,28 @@ if ($in_guild) {
<span style="color: #ebcb8b; font-weight: bold; font-size: 24px;">[<?php echo htmlspecialchars($user_guild_info['guild_tag']); ?>]</span>
<h1 style="display: inline; border-bottom: none; margin-left: 10px;"><?php echo htmlspecialchars($user_guild_info['guild_name']); ?></h1>
</div>
<div style="color: #8c92a3; font-size: 14px;">Votre status : <span class="role-badge role-<?php echo $user_guild_info['role']; ?>"><?php echo $user_guild_info['role']; ?></span></div>
<div style="color: #8c92a3; font-size: 13px;">
<?php if ($user_guild_info['role'] === 'superviseur' || $user_guild_info['role'] === 'officier'): ?>
<form method="POST" style="display: inline-flex; align-items: center; gap: 10px;">
<input type="hidden" name="action" value="update_recruitment_status">
<label style="color: #8c92a3; font-size: 12px;">Recrutement :</label>
<select name="recruitment_status" onchange="this.form.submit()" style="background: #1a202c; color: #fff; border: 1px solid #334155; padding: 4px 8px; font-size: 11px; border-radius: 4px; cursor: pointer;">
<option value="ouvert" <?php echo $user_guild_info['recruitment_status'] === 'ouvert' ? 'selected' : ''; ?>>Ouvert</option>
<option value="validation" <?php echo $user_guild_info['recruitment_status'] === 'validation' ? 'selected' : ''; ?>>Par validation</option>
<option value="ferme" <?php echo $user_guild_info['recruitment_status'] === 'ferme' ? 'selected' : ''; ?>>Fermé</option>
</select>
</form>
<?php else: ?>
Recrutement :
<?php if ($user_guild_info['recruitment_status'] === 'ouvert'): ?>
<span style="color:#a3be8c; font-weight:bold;">OUVERT</span>
<?php elseif ($user_guild_info['recruitment_status'] === 'validation'): ?>
<span style="color:#ebcb8b; font-weight:bold;">SUR VALIDATION</span>
<?php else: ?>
<span style="color:#bf616a; font-weight:bold;">FERMÉ</span>
<?php endif; ?>
<?php endif; ?>
</div>
</div>
<div style="background: rgba(30, 41, 59, 0.4); border-left: 4px solid #88c0d0; padding: 20px; margin-bottom: 30px; color: #d8dee9; border-radius: 0 4px 4px 0;">
@ -524,23 +590,28 @@ if ($in_guild) {
<?php if($member['user_id'] == $user_id) echo " (Vous)"; ?>
</strong>
</td>
<td><span class="role-badge role-<?php echo $member['role']; ?>"><?php echo $member['role']; ?></span></td>
<td><span class="role-badge role-<?php echo str_replace(' ', '-', $member['role']); ?>"><?php echo $member['role']; ?></span></td>
<td><?php echo date('d/m/Y', strtotime($member['joined_at'])); ?></td>
<?php if ($user_guild_info['role'] === 'superviseur' || $user_guild_info['role'] === 'officier'): ?>
<td>
<?php if ($member['user_id'] != $user_id): ?>
<?php if ($user_guild_info['role'] === 'superviseur'): ?>
<form method="POST" style="display: inline;">
<input type="hidden" name="action" value="update_role">
<input type="hidden" name="target_user_id" value="<?php echo $member['user_id']; ?>">
<select name="new_role" onchange="this.form.submit()" style="background: #1a202c; color: #fff; border: 1px solid #334155; padding: 4px; font-size: 11px; border-radius: 4px; cursor: pointer;">
<option value="membre" <?php echo $member['role'] === 'membre' ? 'selected' : ''; ?>>Membre</option>
<option value="officier" <?php echo $member['role'] === 'officier' ? 'selected' : ''; ?>>Officier</option>
</select>
</form>
<?php endif; ?>
<?php if ($user_guild_info['role'] === 'superviseur' || ($user_guild_info['role'] === 'officier' && $member['role'] === 'membre')): ?>
<a href="?kick=<?php echo $member['user_id']; ?>" style="color: #bf616a; margin-left: 15px;" onclick="return confirm('Voulez-vous vraiment exclure ce membre ?')" title="Exclure"><i class="fa-solid fa-user-xmark"></i></a>
<?php if ($member['role'] === 'en attente'): ?>
<a href="?validate=<?php echo $member['user_id']; ?>&action_type=accept" style="color: #a3be8c; margin-right: 15px;" title="Accepter"><i class="fa-solid fa-check"></i> Accepter</a>
<a href="?validate=<?php echo $member['user_id']; ?>&action_type=refuse" style="color: #bf616a;" title="Refuser"><i class="fa-solid fa-xmark"></i> Refuser</a>
<?php else: ?>
<?php if ($user_guild_info['role'] === 'superviseur'): ?>
<form method="POST" style="display: inline;">
<input type="hidden" name="action" value="update_role">
<input type="hidden" name="target_user_id" value="<?php echo $member['user_id']; ?>">
<select name="new_role" onchange="this.form.submit()" style="background: #1a202c; color: #fff; border: 1px solid #334155; padding: 4px; font-size: 11px; border-radius: 4px; cursor: pointer;">
<option value="membre" <?php echo $member['role'] === 'membre' ? 'selected' : ''; ?>>Membre</option>
<option value="officier" <?php echo $member['role'] === 'officier' ? 'selected' : ''; ?>>Officier</option>
</select>
</form>
<?php endif; ?>
<?php if ($user_guild_info['role'] === 'superviseur' || ($user_guild_info['role'] === 'officier' && $member['role'] === 'membre')): ?>
<a href="?kick=<?php echo $member['user_id']; ?>" style="color: #bf616a; margin-left: 15px;" onclick="return confirm('Voulez-vous vraiment exclure ce membre ?')" title="Exclure"><i class="fa-solid fa-user-xmark"></i></a>
<?php endif; ?>
<?php endif; ?>
<?php endif; ?>
</td>