diff --git a/api_v1_channels.php b/api_v1_channels.php index 2ca5dc1..9c14b53 100644 --- a/api_v1_channels.php +++ b/api_v1_channels.php @@ -24,6 +24,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { $channel_id = $_POST['channel_id'] ?? 0; $name = $_POST['name'] ?? ''; $allow_file_sharing = isset($_POST['allow_file_sharing']) ? 1 : 0; + $message_limit = !empty($_POST['message_limit']) ? (int)$_POST['message_limit'] : null; $theme_color = $_POST['theme_color'] ?? null; if ($theme_color === '') $theme_color = null; @@ -34,8 +35,8 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { if ($server && $server['owner_id'] == $user_id) { $name = strtolower(preg_replace('/[^a-zA-Z0-9\-]/', '-', $name)); - $stmt = db()->prepare("UPDATE channels SET name = ?, allow_file_sharing = ?, theme_color = ? WHERE id = ?"); - $stmt->execute([$name, $allow_file_sharing, $theme_color, $channel_id]); + $stmt = db()->prepare("UPDATE channels SET name = ?, allow_file_sharing = ?, theme_color = ?, message_limit = ? WHERE id = ?"); + $stmt->execute([$name, $allow_file_sharing, $theme_color, $message_limit, $channel_id]); } header('Location: index.php?server_id=' . $server_id . '&channel_id=' . $channel_id); exit; @@ -69,11 +70,12 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { // Basic sanitization for channel name $name = strtolower(preg_replace('/[^a-zA-Z0-9\-]/', '-', $name)); $allow_file_sharing = isset($_POST['allow_file_sharing']) ? 1 : 0; + $message_limit = !empty($_POST['message_limit']) ? (int)$_POST['message_limit'] : null; $theme_color = $_POST['theme_color'] ?? null; if ($theme_color === '') $theme_color = null; - $stmt = db()->prepare("INSERT INTO channels (server_id, name, type, allow_file_sharing, theme_color) VALUES (?, ?, ?, ?, ?)"); - $stmt->execute([$server_id, $name, $type, $allow_file_sharing, $theme_color]); + $stmt = db()->prepare("INSERT INTO channels (server_id, name, type, allow_file_sharing, theme_color, message_limit) VALUES (?, ?, ?, ?, ?, ?)"); + $stmt->execute([$server_id, $name, $type, $allow_file_sharing, $theme_color, $message_limit]); $channel_id = db()->lastInsertId(); header('Location: index.php?server_id=' . $server_id . '&channel_id=' . $channel_id); diff --git a/api_v1_clear_channel.php b/api_v1_clear_channel.php new file mode 100644 index 0000000..2e84faa --- /dev/null +++ b/api_v1_clear_channel.php @@ -0,0 +1,46 @@ + false, "error" => "Unauthorized"]); + exit; +} + +$channel_id = $_POST["channel_id"] ?? null; +if (!$channel_id) { + echo json_encode(["success" => false, "error" => "Missing channel ID"]); + exit; +} + +// Get server_id for this channel +$stmt = db()->prepare("SELECT server_id FROM channels WHERE id = ?"); +$stmt->execute([$channel_id]); +$channel = $stmt->fetch(); + +if (!$channel) { + echo json_encode(["success" => false, "error" => "Channel not found"]); + exit; +} + +$server_id = $channel["server_id"]; + +// Check if user is owner or admin (minimal check for now) +$stmt = db()->prepare("SELECT owner_id FROM servers WHERE id = ?"); +$stmt->execute([$server_id]); +$server = $stmt->fetch(); + +if ($server["owner_id"] != $_SESSION["user_id"]) { + echo json_encode(["success" => false, "error" => "Only the server owner can clear history"]); + exit; +} + +try { + $stmt = db()->prepare("DELETE FROM messages WHERE channel_id = ?"); + $stmt->execute([$channel_id]); + echo json_encode(["success" => true]); +} catch (Exception $e) { + echo json_encode(["success" => false, "error" => $e->getMessage()]); +} diff --git a/api_v1_messages.php b/api_v1_messages.php index cd3922a..33d85bb 100644 --- a/api_v1_messages.php +++ b/api_v1_messages.php @@ -189,6 +189,28 @@ try { $stmt->execute([$channel_id, $user_id, $content, $attachment_url, $metadata]); $last_id = db()->lastInsertId(); + // Enforce message limit if set + $stmt = db()->prepare("SELECT message_limit FROM channels WHERE id = ?"); + $stmt->execute([$channel_id]); + $channel = $stmt->fetch(); + if ($channel && !empty($channel['message_limit'])) { + $limit = (int)$channel['message_limit']; + // Delete oldest messages that exceed the limit + $stmt = db()->prepare(" + DELETE FROM messages + WHERE channel_id = ? + AND id NOT IN ( + SELECT id FROM ( + SELECT id FROM messages + WHERE channel_id = ? + ORDER BY created_at DESC, id DESC + LIMIT ? + ) as tmp + ) + "); + $stmt->execute([$channel_id, $channel_id, $limit]); + } + // Fetch message with username for the response $stmt = db()->prepare("SELECT m.*, u.username, u.avatar_url FROM messages m JOIN users u ON m.user_id = u.id WHERE m.id = ?"); $stmt->execute([$last_id]); diff --git a/assets/js/main.js b/assets/js/main.js index 2e14fd1..3a9c459 100644 --- a/assets/js/main.js +++ b/assets/js/main.js @@ -592,11 +592,34 @@ document.addEventListener('DOMContentLoaded', () => { modal.querySelector('#edit-channel-id').value = btn.dataset.id; modal.querySelector('#edit-channel-name').value = btn.dataset.name; modal.querySelector('#edit-channel-files').checked = btn.dataset.files == '1'; + modal.querySelector('#edit-channel-limit').value = btn.dataset.limit || ''; modal.querySelector('#edit-channel-theme').value = btn.dataset.theme || '#5865f2'; modal.querySelector('#delete-channel-id').value = btn.dataset.id; }); }); + // Clear Channel History + const clearHistoryBtn = document.getElementById('clear-channel-history-btn'); + clearHistoryBtn?.addEventListener('click', async () => { + const channelId = document.getElementById('edit-channel-id').value; + if (!confirm('Voulez-vous vraiment vider tout l\'historique de ce salon ? Cette action est irréversible.')) return; + + try { + const formData = new FormData(); + formData.append('channel_id', channelId); + const resp = await fetch('api_v1_clear_channel.php', { + method: 'POST', + body: formData + }); + const result = await resp.json(); + if (result.success) { + location.reload(); + } else { + alert(result.error || 'Erreur lors du nettoyage de l\'historique'); + } + } catch (e) { console.error(e); } + }); + // Roles Management const rolesTabBtn = document.getElementById('roles-tab-btn'); const rolesList = document.getElementById('roles-list'); diff --git a/index.php b/index.php index 2e02b6e..1410983 100644 --- a/index.php +++ b/index.php @@ -79,13 +79,14 @@ if ($is_dm_view) { $channel_theme = $active_channel['theme_color'] ?? null; // Fetch messages + $display_limit = !empty($active_channel['message_limit']) ? (int)$active_channel['message_limit'] : 50; $stmt = db()->prepare(" SELECT m.*, u.username, u.avatar_url FROM messages m JOIN users u ON m.user_id = u.id WHERE m.channel_id = ? ORDER BY m.created_at ASC - LIMIT 50 + LIMIT " . $display_limit . " "); $stmt->execute([$active_channel_id]); $messages = $stmt->fetchAll(); @@ -224,6 +225,7 @@ $projectImageUrl = $_SERVER['PROJECT_IMAGE_URL'] ?? ''; data-id="" data-name="" data-files="" + data-limit="" data-theme=""> @@ -246,6 +248,7 @@ $projectImageUrl = $_SERVER['PROJECT_IMAGE_URL'] ?? ''; data-id="" data-name="" data-files="" + data-limit="" data-theme=""> @@ -705,6 +708,11 @@ $projectImageUrl = $_SERVER['PROJECT_IMAGE_URL'] ?? ''; +