Projet final V5 + Forum
This commit is contained in:
parent
430d57545f
commit
f56ab7ba2b
@ -38,21 +38,34 @@ if ($_SERVER['REQUEST_METHOD'] === 'GET') {
|
||||
|
||||
if ($pinned) {
|
||||
try {
|
||||
$thread_id = isset($_GET['thread_id']) && $_GET['thread_id'] !== '' ? (int)$_GET['thread_id'] : null;
|
||||
|
||||
// Get server_id for the channel
|
||||
$stmt = db()->prepare("SELECT server_id FROM channels WHERE id = ?");
|
||||
$stmt->execute([$channel_id]);
|
||||
$server_id = $stmt->fetchColumn();
|
||||
|
||||
$stmt = db()->prepare("
|
||||
$query = "
|
||||
SELECT m.*, u.display_name as username, u.username as login_name, u.avatar_url,
|
||||
(SELECT r.color FROM roles r JOIN user_roles ur ON r.id = ur.role_id WHERE ur.user_id = u.id AND r.server_id = ? ORDER BY r.position DESC LIMIT 1) as role_color,
|
||||
(SELECT r.icon_url FROM roles r JOIN user_roles ur ON r.id = ur.role_id WHERE ur.user_id = u.id AND r.server_id = ? ORDER BY r.position DESC LIMIT 1) as role_icon
|
||||
FROM messages m
|
||||
JOIN users u ON m.user_id = u.id
|
||||
WHERE m.channel_id = ? AND m.is_pinned = 1
|
||||
ORDER BY m.created_at DESC
|
||||
");
|
||||
$stmt->execute([$server_id ?: 0, $server_id ?: 0, $channel_id]);
|
||||
";
|
||||
$params = [$server_id ?: 0, $server_id ?: 0, $channel_id];
|
||||
|
||||
if ($thread_id !== null) {
|
||||
$query .= " AND m.thread_id = ?";
|
||||
$params[] = $thread_id;
|
||||
} else {
|
||||
$query .= " AND m.thread_id IS NULL";
|
||||
}
|
||||
|
||||
$query .= " ORDER BY m.created_at DESC";
|
||||
|
||||
$stmt = db()->prepare($query);
|
||||
$stmt->execute($params);
|
||||
$msgs = $stmt->fetchAll();
|
||||
|
||||
foreach ($msgs as &$m) {
|
||||
@ -70,21 +83,34 @@ if ($_SERVER['REQUEST_METHOD'] === 'GET') {
|
||||
if (isset($_GET['after_id'])) {
|
||||
try {
|
||||
$after_id = (int)$_GET['after_id'];
|
||||
$thread_id = isset($_GET['thread_id']) && $_GET['thread_id'] !== '' ? (int)$_GET['thread_id'] : null;
|
||||
|
||||
// Get server_id for the channel
|
||||
$stmt = db()->prepare("SELECT server_id FROM channels WHERE id = ?");
|
||||
$stmt->execute([$channel_id]);
|
||||
$server_id = $stmt->fetchColumn();
|
||||
|
||||
$stmt = db()->prepare("
|
||||
$query = "
|
||||
SELECT m.*, u.display_name as username, u.username as login_name, u.avatar_url,
|
||||
(SELECT r.color FROM roles r JOIN user_roles ur ON r.id = ur.role_id WHERE ur.user_id = u.id AND r.server_id = ? ORDER BY r.position DESC LIMIT 1) as role_color,
|
||||
(SELECT r.icon_url FROM roles r JOIN user_roles ur ON r.id = ur.role_id WHERE ur.user_id = u.id AND r.server_id = ? ORDER BY r.position DESC LIMIT 1) as role_icon
|
||||
FROM messages m
|
||||
JOIN users u ON m.user_id = u.id
|
||||
WHERE m.channel_id = ? AND m.id > ?
|
||||
ORDER BY m.id ASC
|
||||
");
|
||||
$stmt->execute([$server_id ?: 0, $server_id ?: 0, $channel_id, $after_id]);
|
||||
";
|
||||
$params = [$server_id ?: 0, $server_id ?: 0, $channel_id, $after_id];
|
||||
|
||||
if ($thread_id !== null) {
|
||||
$query .= " AND m.thread_id = ?";
|
||||
$params[] = $thread_id;
|
||||
} else {
|
||||
$query .= " AND m.thread_id IS NULL";
|
||||
}
|
||||
|
||||
$query .= " ORDER BY m.id ASC";
|
||||
|
||||
$stmt = db()->prepare($query);
|
||||
$stmt->execute($params);
|
||||
$msgs = $stmt->fetchAll();
|
||||
|
||||
foreach ($msgs as &$m) {
|
||||
|
||||
@ -498,6 +498,16 @@ document.addEventListener('DOMContentLoaded', () => {
|
||||
if (msg.type === 'message') {
|
||||
const data = JSON.parse(msg.data);
|
||||
if (data.channel_id == currentChannel) {
|
||||
// For forums, only append if we are in the correct thread
|
||||
if (window.activeChannelType === 'forum') {
|
||||
if (!currentThread || data.thread_id != currentThread) {
|
||||
return;
|
||||
}
|
||||
} else if (data.thread_id) {
|
||||
// If it's not a forum channel but has a thread_id (shouldn't happen with current logic but for safety)
|
||||
return;
|
||||
}
|
||||
|
||||
appendMessage(data);
|
||||
|
||||
// Desktop Notifications for mentions
|
||||
@ -551,11 +561,24 @@ document.addEventListener('DOMContentLoaded', () => {
|
||||
|
||||
setInterval(async () => {
|
||||
if (!currentChannel) return;
|
||||
// For forums, if we're not in a thread, don't poll for messages
|
||||
if (window.activeChannelType === 'forum' && !currentThread) return;
|
||||
|
||||
// If we are in a non-forum channel, we should NOT have a currentThread
|
||||
if (window.activeChannelType !== 'forum' && currentThread) return;
|
||||
|
||||
try {
|
||||
const resp = await fetch(`api_v1_messages.php?channel_id=${currentChannel}&after_id=${lastMessageId}`);
|
||||
const threadParam = currentThread ? `&thread_id=${currentThread}` : '';
|
||||
const resp = await fetch(`api_v1_messages.php?channel_id=${currentChannel}&after_id=${lastMessageId}${threadParam}`);
|
||||
const data = await resp.json();
|
||||
if (data.success && data.messages && data.messages.length > 0) {
|
||||
data.messages.forEach(msg => {
|
||||
// Double check thread_id in JS side too
|
||||
if (window.activeChannelType === 'forum') {
|
||||
if (msg.thread_id != currentThread) return;
|
||||
} else {
|
||||
if (msg.thread_id) return;
|
||||
}
|
||||
appendMessage(msg);
|
||||
});
|
||||
}
|
||||
@ -2652,6 +2675,14 @@ document.addEventListener('DOMContentLoaded', () => {
|
||||
if (!msg || !msg.id) return;
|
||||
if (document.querySelector(`.message-item[data-id="${msg.id}"]`)) return;
|
||||
|
||||
// Security: Ensure message belongs to current channel/thread
|
||||
if (msg.channel_id && msg.channel_id != currentChannel) return;
|
||||
if (window.activeChannelType === 'forum') {
|
||||
if (!currentThread || msg.thread_id != currentThread) return;
|
||||
} else {
|
||||
if (msg.thread_id) return;
|
||||
}
|
||||
|
||||
// Auto-populate metadata for video platforms if missing
|
||||
const dmRegexForMeta = /(?:https?:\/\/)?(?:www\.)?(?:dailymotion\.com\/video\/|dai\.ly\/)([a-zA-Z0-9]+)/;
|
||||
const dmMatchForMeta = msg.content.match(dmRegexForMeta);
|
||||
@ -2665,6 +2696,11 @@ document.addEventListener('DOMContentLoaded', () => {
|
||||
}
|
||||
|
||||
const messagesList = document.getElementById('messages-list');
|
||||
const messagesInner = document.querySelector('.messages-list-inner');
|
||||
const targetContainer = messagesInner || messagesList;
|
||||
|
||||
if (!targetContainer) return;
|
||||
|
||||
const div = document.createElement('div');
|
||||
div.className = 'message-item';
|
||||
div.dataset.id = msg.id;
|
||||
@ -2751,7 +2787,7 @@ document.addEventListener('DOMContentLoaded', () => {
|
||||
${actionsHtml}
|
||||
<div class="message-reaction-picker-anchor"></div>
|
||||
`;
|
||||
messagesList.appendChild(div);
|
||||
targetContainer.appendChild(div);
|
||||
scrollToBottom(isMe);
|
||||
|
||||
// Ensure we scroll again when images/videos load
|
||||
|
||||
BIN
assets/pasted-20260219-121958-92d2aa61.png
Normal file
BIN
assets/pasted-20260219-121958-92d2aa61.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 195 KiB |
15
index.php
15
index.php
@ -137,6 +137,10 @@ requireLogin();
|
||||
|
||||
$user = getCurrentUser();
|
||||
$current_user_id = $user['id'];
|
||||
$messages = []; // Initialize messages array
|
||||
$threads = [];
|
||||
$rules = [];
|
||||
$autoroles = [];
|
||||
|
||||
// Fetch servers user is member of
|
||||
$stmt = db()->prepare("
|
||||
@ -262,7 +266,9 @@ if ($is_dm_view) {
|
||||
}
|
||||
}
|
||||
|
||||
if (!$active_thread && $channel_type === 'rules') {
|
||||
if ($active_thread) {
|
||||
// Thread messages already fetched above
|
||||
} elseif ($channel_type === 'rules') {
|
||||
$stmt = db()->prepare("SELECT * FROM channel_rules WHERE channel_id = ? ORDER BY position ASC");
|
||||
$stmt->execute([$active_channel_id]);
|
||||
$rules = $stmt->fetchAll();
|
||||
@ -293,7 +299,7 @@ if ($is_dm_view) {
|
||||
$stmt->execute([$active_server_id, $active_server_id, $active_channel_id]);
|
||||
$threads = $stmt->fetchAll();
|
||||
} else {
|
||||
// Fetch messages
|
||||
// Fetch messages for normal chat channels
|
||||
$display_limit = !empty($active_channel['message_limit']) ? (int)$active_channel['message_limit'] : 50;
|
||||
|
||||
$stmt = db()->prepare("
|
||||
@ -302,7 +308,7 @@ if ($is_dm_view) {
|
||||
(SELECT r.icon_url FROM roles r JOIN user_roles ur ON r.id = ur.role_id WHERE ur.user_id = u.id AND r.server_id = ? ORDER BY r.position DESC LIMIT 1) as role_icon
|
||||
FROM messages m
|
||||
JOIN users u ON m.user_id = u.id
|
||||
WHERE m.channel_id = ?
|
||||
WHERE m.channel_id = ? AND m.thread_id IS NULL
|
||||
ORDER BY m.created_at ASC
|
||||
LIMIT " . $display_limit . "
|
||||
");
|
||||
@ -386,6 +392,7 @@ $projectImageUrl = $_SERVER['PROJECT_IMAGE_URL'] ?? '';
|
||||
window.canManageServer = <?php echo ($can_manage_server ?? false) ? 'true' : 'false'; ?>;
|
||||
window.canManageChannels = <?php echo ($can_manage_channels ?? false) ? 'true' : 'false'; ?>;
|
||||
window.activeChannelId = <?php echo $active_channel_id; ?>;
|
||||
window.activeChannelType = "<?php echo $channel_type ?? 'chat'; ?>";
|
||||
window.currentChannelName = "<?php echo addslashes($current_channel_name); ?>";
|
||||
window.isDndMode = <?php echo ($user['dnd_mode'] ?? 0) ? 'true' : 'false'; ?>;
|
||||
window.soundNotifications = <?php echo ($user['sound_notifications'] ?? 0) ? 'true' : 'false'; ?>;
|
||||
@ -1101,7 +1108,7 @@ $projectImageUrl = $_SERVER['PROJECT_IMAGE_URL'] ?? '';
|
||||
$show_input = true;
|
||||
if ($channel_type === 'rules') $show_input = false;
|
||||
if ($channel_type === 'forum' && !$active_thread) $show_input = false;
|
||||
if ($channel_type === 'announcement' && !$can_manage_channels) $show_input = false;
|
||||
if (($channel_type === 'announcement' || $channel_type === 'text') && !$can_manage_channels) $show_input = false;
|
||||
|
||||
if ($show_input):
|
||||
if (!$can_send) {
|
||||
|
||||
25
requests.log
25
requests.log
@ -782,3 +782,28 @@
|
||||
2026-02-19 12:18:33 - GET /index.php?server_id=1&channel_id=13 - POST: []
|
||||
2026-02-19 12:18:58 - GET /index.php?server_id=1&channel_id=13&thread_id=3 - POST: []
|
||||
2026-02-19 12:19:02 - GET /index.php?server_id=1&channel_id=13 - POST: []
|
||||
2026-02-19 12:22:26 - GET /?fl_project=38443 - POST: []
|
||||
2026-02-19 12:35:03 - GET /?fl_project=38443 - POST: []
|
||||
2026-02-19 12:35:49 - GET /?fl_project=38443 - POST: []
|
||||
2026-02-19 12:40:12 - GET / - POST: []
|
||||
2026-02-19 12:40:37 - GET /?fl_project=38443 - POST: []
|
||||
2026-02-19 12:40:45 - GET /index.php?server_id=1&channel_id=6 - POST: []
|
||||
2026-02-19 12:40:48 - GET /index.php?server_id=1&channel_id=6 - POST: []
|
||||
2026-02-19 12:40:51 - GET /index.php?server_id=1&channel_id=13 - POST: []
|
||||
2026-02-19 12:40:54 - GET /index.php?server_id=1&channel_id=13&thread_id=3 - POST: []
|
||||
2026-02-19 12:40:58 - GET /index.php?server_id=1&channel_id=13 - POST: []
|
||||
2026-02-19 12:41:00 - GET /index.php?server_id=1&channel_id=13&thread_id=2 - POST: []
|
||||
2026-02-19 12:41:02 - GET /index.php?server_id=1&channel_id=13 - POST: []
|
||||
2026-02-19 12:41:03 - GET /index.php?server_id=1&channel_id=13&thread_id=4 - POST: []
|
||||
2026-02-19 12:41:18 - GET /index.php?server_id=1&channel_id=13 - POST: []
|
||||
2026-02-19 12:41:19 - GET /index.php?server_id=1&channel_id=13&thread_id=4 - POST: []
|
||||
2026-02-19 12:41:22 - GET /index.php?server_id=1&channel_id=13 - POST: []
|
||||
2026-02-19 12:41:23 - GET /index.php?server_id=1&channel_id=13&thread_id=3 - POST: []
|
||||
2026-02-19 12:41:32 - GET /index.php?server_id=1&channel_id=13 - POST: []
|
||||
2026-02-19 12:41:38 - GET /index.php?server_id=1&channel_id=13&thread_id=4 - POST: []
|
||||
2026-02-19 12:41:41 - GET /index.php?server_id=1&channel_id=13 - POST: []
|
||||
2026-02-19 12:41:42 - GET /index.php?server_id=1&channel_id=13&thread_id=2 - POST: []
|
||||
2026-02-19 12:41:46 - GET /index.php?server_id=1&channel_id=13 - POST: []
|
||||
2026-02-19 12:41:48 - GET /index.php?server_id=1&channel_id=13&thread_id=4 - POST: []
|
||||
2026-02-19 12:41:52 - GET /index.php?server_id=1&channel_id=13 - POST: []
|
||||
2026-02-19 12:41:56 - GET /index.php?server_id=1&channel_id=13&thread_id=3 - POST: []
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user