autoroles

This commit is contained in:
Flatlogic Bot 2026-02-16 03:19:06 +00:00
parent 41fa76eec3
commit f20e908050
6 changed files with 368 additions and 5 deletions

102
api_v1_autoroles.php Normal file
View File

@ -0,0 +1,102 @@
<?php
header('Content-Type: application/json');
require_once 'auth/session.php';
require_once 'includes/permissions.php';
requireLogin();
$user_id = $_SESSION['user_id'];
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$json = json_decode(file_get_contents('php://input'), true);
$action = $_POST['action'] ?? ($json['action'] ?? '');
if ($action === 'create') {
$channel_id = $_POST['channel_id'] ?? 0;
$server_id = $_POST['server_id'] ?? 0;
$icon = $_POST['icon'] ?? '';
$title = $_POST['title'] ?? '';
$role_id = $_POST['role_id'] ?? 0;
if (Permissions::hasPermission($user_id, $server_id, Permissions::MANAGE_CHANNELS)) {
$stmt = db()->prepare("INSERT INTO channel_autoroles (channel_id, icon, title, role_id) VALUES (?, ?, ?, ?)");
$stmt->execute([$channel_id, $icon, $title, $role_id]);
}
header('Location: index.php?server_id=' . $server_id . '&channel_id=' . $channel_id);
exit;
}
if ($action === 'update') {
$id = $_POST['id'] ?? 0;
$channel_id = $_POST['channel_id'] ?? 0;
$server_id = $_POST['server_id'] ?? 0;
$icon = $_POST['icon'] ?? '';
$title = $_POST['title'] ?? '';
$role_id = $_POST['role_id'] ?? 0;
if (Permissions::hasPermission($user_id, $server_id, Permissions::MANAGE_CHANNELS)) {
$stmt = db()->prepare("UPDATE channel_autoroles SET icon = ?, title = ?, role_id = ? WHERE id = ?");
$stmt->execute([$icon, $title, $role_id, $id]);
}
header('Location: index.php?server_id=' . $server_id . '&channel_id=' . $channel_id);
exit;
}
if ($action === 'delete') {
$id = $_POST['id'] ?? 0;
$channel_id = $_POST['channel_id'] ?? 0;
$server_id = $_POST['server_id'] ?? 0;
if (Permissions::hasPermission($user_id, $server_id, Permissions::MANAGE_CHANNELS)) {
$stmt = db()->prepare("DELETE FROM channel_autoroles WHERE id = ?");
$stmt->execute([$id]);
}
header('Location: index.php?server_id=' . $server_id . '&channel_id=' . $channel_id);
exit;
}
if ($action === 'toggle') {
// This will be called via AJAX
$role_id = $json['role_id'] ?? 0;
if (!$role_id) {
echo json_encode(['success' => false, 'error' => 'Invalid role']);
exit;
}
// Find the server for this role
$stmt = db()->prepare("SELECT server_id FROM roles WHERE id = ?");
$stmt->execute([$role_id]);
$role = $stmt->fetch();
if (!$role) {
echo json_encode(['success' => false, 'error' => 'Role not found']);
exit;
}
// Check if user is member of server
$stmt = db()->prepare("SELECT 1 FROM server_members WHERE server_id = ? AND user_id = ?");
$stmt->execute([$role['server_id'], $user_id]);
if (!$stmt->fetch()) {
echo json_encode(['success' => false, 'error' => 'Not a member of this server']);
exit;
}
// Toggle role
$stmt = db()->prepare("SELECT 1 FROM user_roles WHERE user_id = ? AND role_id = ?");
$stmt->execute([$user_id, $role_id]);
$has_role = $stmt->fetch();
if ($has_role) {
$stmt = db()->prepare("DELETE FROM user_roles WHERE user_id = ? AND role_id = ?");
$stmt->execute([$user_id, $role_id]);
$added = false;
} else {
$stmt = db()->prepare("INSERT INTO user_roles (user_id, role_id) VALUES (?, ?)");
$stmt->execute([$user_id, $role_id]);
$added = true;
}
echo json_encode(['success' => true, 'added' => $added]);
exit;
}
}

View File

@ -1092,9 +1092,9 @@ document.addEventListener('DOMContentLoaded', () => {
const editFilesContainer = document.getElementById('edit-channel-files-container');
const clearChatBtn = document.getElementById('clear-channel-history-btn');
if (editLimitContainer) editLimitContainer.style.display = (type === 'rules') ? 'none' : 'block';
if (editFilesContainer) editFilesContainer.style.display = (type === 'rules') ? 'none' : 'block';
if (clearChatBtn) clearChatBtn.style.display = (type === 'rules') ? 'none' : 'inline-block';
if (editLimitContainer) editLimitContainer.style.display = (type === 'rules' || type === 'autorole') ? 'none' : 'block';
if (editFilesContainer) editFilesContainer.style.display = (type === 'rules' || type === 'autorole') ? 'none' : 'block';
if (clearChatBtn) clearChatBtn.style.display = (type === 'rules' || type === 'autorole') ? 'none' : 'inline-block';
});
// RSS Management
@ -2061,8 +2061,8 @@ document.addEventListener('DOMContentLoaded', () => {
}
const limitContainer = document.getElementById('add-channel-limit-container');
const filesContainer = document.getElementById('add-channel-files-container');
if (limitContainer) limitContainer.style.display = (type === 'rules') ? 'none' : 'block';
if (filesContainer) filesContainer.style.display = (type === 'rules') ? 'none' : 'block';
if (limitContainer) limitContainer.style.display = (type === 'rules' || type === 'autorole') ? 'none' : 'block';
if (filesContainer) filesContainer.style.display = (type === 'rules' || type === 'autorole') ? 'none' : 'block';
});
// User Settings - Avatar Search
@ -2277,4 +2277,80 @@ document.addEventListener('DOMContentLoaded', () => {
// Initial load of roles for the server
loadRoles();
// Autorole Toggle
document.addEventListener('click', async (e) => {
const btn = e.target.closest('.autorole-toggle-btn');
if (!btn) return;
const roleId = btn.dataset.roleId;
btn.disabled = true;
try {
const resp = await fetch('api_v1_autoroles.php', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ action: 'toggle', role_id: roleId })
});
const data = await resp.json();
if (data.success) {
if (data.added) {
btn.classList.remove('btn-outline-secondary');
btn.classList.add('btn-primary');
btn.style.backgroundColor = 'var(--blurple)';
btn.style.border = 'none';
} else {
btn.classList.add('btn-outline-secondary');
btn.classList.remove('btn-primary');
btn.style.backgroundColor = '#2b2d31';
btn.style.border = '1px solid #4e5058';
}
} else {
alert(data.error || 'Failed to toggle role');
}
} catch (e) {
console.error(e);
} finally {
btn.disabled = false;
}
});
// Edit Autorole Modal Population
document.addEventListener('click', (e) => {
const btn = e.target.closest('.edit-autorole-btn');
if (!btn) return;
const id = btn.dataset.id;
const icon = btn.dataset.icon;
const title = btn.dataset.title;
const roleId = btn.dataset.roleId;
document.getElementById('edit-autorole-id').value = id;
document.getElementById('edit-autorole-icon').value = icon;
document.getElementById('edit-autorole-title').value = title;
document.getElementById('edit-autorole-role-id').value = roleId;
});
// Universal Emoji Picker Trigger
document.addEventListener('click', (e) => {
const btn = e.target.closest('.open-emoji-picker');
if (!btn) return;
const targetId = btn.dataset.target;
const targetInput = document.querySelector(targetId);
if (typeof showEmojiPicker === 'function') {
showEmojiPicker(btn, (emoji) => {
if (targetInput) {
targetInput.value = emoji;
// Special case for role settings preview
if (targetId === '#edit-role-icon') {
const preview = document.getElementById('selected-role-emoji-preview');
if (preview) preview.textContent = emoji;
}
}
});
}
});
});

View File

@ -0,0 +1,11 @@
-- Add autorole channels support
CREATE TABLE IF NOT EXISTS channel_autoroles (
id INT AUTO_INCREMENT PRIMARY KEY,
channel_id INT NOT NULL,
icon VARCHAR(50) NOT NULL,
title VARCHAR(255) NOT NULL,
role_id INT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (channel_id) REFERENCES channels(id) ON DELETE CASCADE,
FOREIGN KEY (role_id) REFERENCES roles(id) ON DELETE CASCADE
);

View File

@ -9,3 +9,6 @@
2026-02-16 00:15:14 - Server: 1 - Orders: [{"id":"11","position":0,"category_id":null},{"id":"12","position":1,"category_id":null},{"id":"10","position":2,"category_id":null},{"id":"1","position":3,"category_id":"10"},{"id":"6","position":4,"category_id":"10"},{"id":"15","position":5,"category_id":"10"},{"id":"2","position":6,"category_id":"10"},{"id":"14","position":7,"category_id":null},{"id":"13","position":8,"category_id":null},{"id":"9","position":9,"category_id":null},{"id":"3","position":10,"category_id":null}]
2026-02-16 00:17:23 - Server: 1 - Orders: [{"id":"11","position":0,"category_id":null},{"id":"12","position":1,"category_id":null},{"id":"10","position":2,"category_id":null},{"id":"1","position":3,"category_id":"10"},{"id":"6","position":4,"category_id":"10"},{"id":"15","position":5,"category_id":"10"},{"id":"2","position":6,"category_id":"10"},{"id":"14","position":7,"category_id":null},{"id":"13","position":8,"category_id":null},{"id":"9","position":9,"category_id":null},{"id":"3","position":10,"category_id":null}]
2026-02-16 00:17:31 - Server: 1 - Orders: [{"id":"11","position":0,"category_id":null},{"id":"12","position":1,"category_id":null},{"id":"10","position":2,"category_id":null},{"id":"1","position":3,"category_id":"10"},{"id":"6","position":4,"category_id":"10"},{"id":"15","position":5,"category_id":"10"},{"id":"2","position":6,"category_id":"10"},{"id":"14","position":7,"category_id":null},{"id":"13","position":8,"category_id":null},{"id":"9","position":9,"category_id":null},{"id":"3","position":10,"category_id":null}]
2026-02-16 03:07:52 - Server: 1 - Orders: [{"id":"11","position":0,"category_id":null},{"id":"16","position":1,"category_id":null},{"id":"12","position":2,"category_id":null},{"id":"10","position":3,"category_id":null},{"id":"1","position":4,"category_id":"10"},{"id":"6","position":5,"category_id":"10"},{"id":"15","position":6,"category_id":"10"},{"id":"2","position":7,"category_id":"10"},{"id":"14","position":8,"category_id":null},{"id":"13","position":9,"category_id":null},{"id":"9","position":10,"category_id":null},{"id":"3","position":11,"category_id":null}]
2026-02-16 03:08:33 - Server: 1 - Orders: [{"id":"11","position":0,"category_id":null},{"id":"17","position":1,"category_id":null},{"id":"12","position":2,"category_id":null},{"id":"10","position":3,"category_id":null},{"id":"1","position":4,"category_id":"10"},{"id":"6","position":5,"category_id":"10"},{"id":"15","position":6,"category_id":"10"},{"id":"2","position":7,"category_id":"10"},{"id":"14","position":8,"category_id":null},{"id":"13","position":9,"category_id":null},{"id":"9","position":10,"category_id":null},{"id":"3","position":11,"category_id":null}]
2026-02-16 03:09:18 - Server: 1 - Orders: [{"id":"11","position":0,"category_id":null},{"id":"17","position":1,"category_id":null},{"id":"12","position":2,"category_id":null},{"id":"10","position":3,"category_id":null},{"id":"1","position":4,"category_id":"10"},{"id":"6","position":5,"category_id":"10"},{"id":"15","position":6,"category_id":"10"},{"id":"2","position":7,"category_id":"10"},{"id":"18","position":8,"category_id":"10"},{"id":"14","position":9,"category_id":null},{"id":"13","position":10,"category_id":null},{"id":"9","position":11,"category_id":null},{"id":"3","position":12,"category_id":null}]

151
index.php
View File

@ -146,6 +146,10 @@ if ($is_dm_view) {
$stmt = db()->prepare("SELECT * FROM channel_rules WHERE channel_id = ? ORDER BY position ASC");
$stmt->execute([$active_channel_id]);
$rules = $stmt->fetchAll();
} elseif ($channel_type === 'autorole') {
$stmt = db()->prepare("SELECT ca.*, r.name as role_name FROM channel_autoroles ca JOIN roles r ON ca.role_id = r.id WHERE ca.channel_id = ? ORDER BY ca.id ASC");
$stmt->execute([$active_channel_id]);
$autoroles = $stmt->fetchAll();
} elseif ($channel_type === 'forum') {
$filter_status = $_GET['status'] ?? 'all';
$status_where = "";
@ -379,6 +383,7 @@ $projectImageUrl = $_SERVER['PROJECT_IMAGE_URL'] ?? '';
<?php
if ($c['type'] === 'announcement') echo '<i class="fa-solid fa-bullhorn"></i>';
elseif ($c['type'] === 'rules') echo '<i class="fa-solid fa-gavel"></i>';
elseif ($c['type'] === 'autorole') echo '<i class="fa-solid fa-shield-halved"></i>';
elseif ($c['type'] === 'forum') echo '<i class="fa-solid fa-comments"></i>';
elseif ($c['type'] === 'voice') echo '<i class="fa-solid fa-volume-up"></i>';
else echo '<i class="fa-solid fa-hashtag"></i>';
@ -498,6 +503,7 @@ $projectImageUrl = $_SERVER['PROJECT_IMAGE_URL'] ?? '';
} else {
if ($active_channel['type'] === 'announcement') echo '<i class="fa-solid fa-bullhorn"></i>';
elseif ($active_channel['type'] === 'rules') echo '<i class="fa-solid fa-gavel"></i>';
elseif ($active_channel['type'] === 'autorole') echo '<i class="fa-solid fa-shield-halved"></i>';
elseif ($active_channel['type'] === 'forum') echo '<i class="fa-solid fa-comments"></i>';
elseif ($active_channel['type'] === 'voice') echo '<i class="fa-solid fa-volume-up"></i>';
else echo '<i class="fa-solid fa-hashtag"></i>';
@ -649,6 +655,62 @@ $projectImageUrl = $_SERVER['PROJECT_IMAGE_URL'] ?? '';
</div>
<?php endif; ?>
</div>
<?php elseif($channel_type === 'autorole'): ?>
<div class="autoroles-container p-4">
<h2 class="mb-4">🛡️ <?php echo htmlspecialchars($current_channel_name); ?></h2>
<p class="text-muted mb-4">Cliquez sur un bouton pour vous attribuer ou vous retirer un rôle.</p>
<div class="d-flex flex-wrap gap-3" id="autorole-buttons-list">
<?php foreach($autoroles as $ar):
// Check if user has this role
$stmtHasRole = db()->prepare("SELECT 1 FROM user_roles WHERE user_id = ? AND role_id = ?");
$stmtHasRole->execute([$current_user_id, $ar['role_id']]);
$has_role = $stmtHasRole->fetch();
?>
<div class="autorole-card p-1 rounded" style="background-color: #2b2d31; border: 1px solid #4e5058; min-width: 200px;">
<button class="btn autorole-toggle-btn d-flex align-items-center gap-2 px-4 py-3 w-100 <?php echo $has_role ? 'btn-primary' : 'btn-outline-secondary'; ?>"
data-role-id="<?php echo $ar['role_id']; ?>"
data-id="<?php echo $ar['id']; ?>"
style="<?php echo $has_role ? 'background-color: var(--blurple); border: none;' : 'background-color: #2b2d31; border: none; color: white;'; ?>">
<span style="font-size: 1.5em;"><?php echo htmlspecialchars($ar['icon']); ?></span>
<div class="text-start">
<div class="fw-bold"><?php echo htmlspecialchars($ar['title']); ?></div>
<div class="small opacity-75"><?php echo htmlspecialchars($ar['role_name']); ?></div>
</div>
</button>
<?php if($can_manage_channels): ?>
<div class="d-flex justify-content-end gap-2 px-2 pb-2 border-top border-secondary pt-2 mt-1">
<button type="button" class="btn btn-sm btn-link text-info p-0 edit-autorole-btn"
data-id="<?php echo $ar['id']; ?>"
data-icon="<?php echo htmlspecialchars($ar['icon']); ?>"
data-title="<?php echo htmlspecialchars($ar['title']); ?>"
data-role-id="<?php echo $ar['role_id']; ?>"
data-bs-toggle="modal" data-bs-target="#editAutoroleModal">
<i class="fa-solid fa-pen-to-square"></i> Modifier
</button>
<form action="api_v1_autoroles.php" method="POST" class="m-0">
<input type="hidden" name="action" value="delete">
<input type="hidden" name="id" value="<?php echo $ar['id']; ?>">
<input type="hidden" name="channel_id" value="<?php echo $active_channel_id; ?>">
<input type="hidden" name="server_id" value="<?php echo $active_server_id; ?>">
<button type="submit" class="btn btn-sm btn-link text-danger p-0 ms-1" title="Delete Autorole" onclick="return confirm('Supprimer cet autorole ?')">
<i class="fa-solid fa-trash"></i> Supprimer
</button>
</form>
</div>
<?php endif; ?>
</div>
<?php endforeach; ?>
</div>
<?php if($can_manage_channels): ?>
<div class="mt-5 pt-4 border-top border-secondary">
<button class="btn btn-outline-primary" data-bs-toggle="modal" data-bs-target="#addAutoroleModal">
<i class="fa-solid fa-plus me-2"></i> Ajouter un autorole
</button>
</div>
<?php endif; ?>
</div>
<?php elseif($channel_type === 'forum'): ?>
<div class="forum-container p-4">
<div class="d-flex justify-content-between align-items-center mb-4">
@ -1143,6 +1205,7 @@ $projectImageUrl = $_SERVER['PROJECT_IMAGE_URL'] ?? '';
<option value="announcement">Announcements</option>
<option value="rules">Rules</option>
<option value="forum">Forum</option>
<option value="autorole">Autoroles</option>
<option value="voice">Voice Channel</option>
<option value="separator">Separator</option>
<option value="category">Category</option>
@ -1210,6 +1273,93 @@ $projectImageUrl = $_SERVER['PROJECT_IMAGE_URL'] ?? '';
</div>
</div>
<!-- Add Autorole Modal -->
<div class="modal fade" id="addAutoroleModal" tabindex="-1">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Ajouter un Autorole</h5>
<button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal"></button>
</div>
<form action="api_v1_autoroles.php" method="POST">
<input type="hidden" name="action" value="create">
<input type="hidden" name="channel_id" value="<?php echo $active_channel_id; ?>">
<input type="hidden" name="server_id" value="<?php echo $active_server_id; ?>">
<div class="modal-body">
<div class="mb-3">
<label class="form-label text-uppercase fw-bold" style="font-size: 0.7em; color: var(--text-muted);">Icône (Emoji)</label>
<div class="d-flex align-items-center mb-2">
<input type="text" name="icon" id="add-autorole-icon" class="form-control" style="width: 60px; text-align: center; font-size: 1.5em;" placeholder="🚀" required readonly>
<button type="button" class="btn btn-outline-secondary ms-2 open-emoji-picker" data-target="#add-autorole-icon">Choisir...</button>
</div>
</div>
<div class="mb-3">
<label class="form-label text-uppercase fw-bold" style="font-size: 0.7em; color: var(--text-muted);">Titre du bouton</label>
<input type="text" name="title" class="form-control" placeholder="Ex: Joueur" required>
</div>
<div class="mb-3">
<label class="form-label text-uppercase fw-bold" style="font-size: 0.7em; color: var(--text-muted);">Rôle à attribuer</label>
<select name="role_id" class="form-select bg-dark text-white border-secondary" required>
<option value="">Sélectionnez un rôle</option>
<?php foreach($server_roles as $role): ?>
<option value="<?php echo $role['id']; ?>"><?php echo htmlspecialchars($role['name']); ?></option>
<?php endforeach; ?>
</select>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-link text-white text-decoration-none" data-bs-dismiss="modal">Annuler</button>
<button type="submit" class="btn btn-primary" style="background-color: var(--blurple); border: none;">Créer le bouton</button>
</div>
</form>
</div>
</div>
</div>
<!-- Edit Autorole Modal -->
<div class="modal fade" id="editAutoroleModal" tabindex="-1">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Modifier l'Autorole</h5>
<button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal"></button>
</div>
<form action="api_v1_autoroles.php" method="POST">
<input type="hidden" name="action" value="update">
<input type="hidden" name="id" id="edit-autorole-id">
<input type="hidden" name="channel_id" value="<?php echo $active_channel_id; ?>">
<input type="hidden" name="server_id" value="<?php echo $active_server_id; ?>">
<div class="modal-body">
<div class="mb-3">
<label class="form-label text-uppercase fw-bold" style="font-size: 0.7em; color: var(--text-muted);">Icône (Emoji)</label>
<div class="d-flex align-items-center mb-2">
<input type="text" name="icon" id="edit-autorole-icon" class="form-control" style="width: 60px; text-align: center; font-size: 1.5em;" required readonly>
<button type="button" class="btn btn-outline-secondary ms-2 open-emoji-picker" data-target="#edit-autorole-icon">Modifier...</button>
</div>
</div>
<div class="mb-3">
<label class="form-label text-uppercase fw-bold" style="font-size: 0.7em; color: var(--text-muted);">Titre du bouton</label>
<input type="text" name="title" id="edit-autorole-title" class="form-control" required>
</div>
<div class="mb-3">
<label class="form-label text-uppercase fw-bold" style="font-size: 0.7em; color: var(--text-muted);">Rôle à attribuer</label>
<select name="role_id" id="edit-autorole-role-id" class="form-select bg-dark text-white border-secondary" required>
<option value="">Sélectionnez un rôle</option>
<?php foreach($server_roles as $role): ?>
<option value="<?php echo $role['id']; ?>"><?php echo htmlspecialchars($role['name']); ?></option>
<?php endforeach; ?>
</select>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-link text-white text-decoration-none" data-bs-dismiss="modal">Annuler</button>
<button type="submit" class="btn btn-primary" style="background-color: var(--blurple); border: none;">Enregistrer les modifications</button>
</div>
</form>
</div>
</div>
</div>
<!-- Edit Channel Modal -->
<div class="modal fade" id="editChannelModal" tabindex="-1">
<div class="modal-dialog modal-lg modal-dialog-centered">
@ -1253,6 +1403,7 @@ $projectImageUrl = $_SERVER['PROJECT_IMAGE_URL'] ?? '';
<option value="announcement">Announcements</option>
<option value="rules">Rules</option>
<option value="forum">Forum</option>
<option value="autorole">Autoroles</option>
<option value="voice">Voice Channel</option>
<option value="category">Category</option>
<option value="separator">Separator</option>

View File

@ -140,3 +140,23 @@
2026-02-16 02:57:17 - GET /index.php?server_id=1 - POST: []
2026-02-16 02:58:22 - GET /?fl_project=38443 - POST: []
2026-02-16 02:59:03 - GET /?fl_project=38443 - POST: []
2026-02-16 03:05:28 - GET / - POST: []
2026-02-16 03:06:27 - GET /?fl_project=38443 - POST: []
2026-02-16 03:07:23 - GET /index.php?server_id=1 - POST: []
2026-02-16 03:07:43 - GET /index.php?server_id=1&channel_id=16 - POST: []
2026-02-16 03:08:00 - GET /index.php?server_id=1&channel_id=16 - POST: []
2026-02-16 03:08:21 - GET /index.php?server_id=1 - POST: []
2026-02-16 03:08:30 - GET /index.php?server_id=1&channel_id=17 - POST: []
2026-02-16 03:09:15 - GET /index.php?server_id=1&channel_id=18 - POST: []
2026-02-16 03:09:47 - GET /index.php?server_id=1&channel_id=15 - POST: []
2026-02-16 03:09:51 - GET /index.php?server_id=1&channel_id=17 - POST: []
2026-02-16 03:09:54 - GET /index.php?server_id=1&channel_id=17 - POST: []
2026-02-16 03:10:22 - GET /index.php?server_id=1&channel_id=17 - POST: []
2026-02-16 03:10:27 - GET /index.php?server_id=1&channel_id=17 - POST: []
2026-02-16 03:10:35 - GET /index.php?server_id=1&channel_id=17 - POST: []
2026-02-16 03:10:58 - GET /index.php?server_id=1&channel_id=17 - POST: []
2026-02-16 03:15:47 - GET /?fl_project=38443 - POST: []
2026-02-16 03:16:11 - GET /index.php?server_id=1&channel_id=17 - POST: []
2026-02-16 03:16:19 - GET /index.php?server_id=1&channel_id=17 - POST: []
2026-02-16 03:16:26 - GET /index.php?server_id=1&channel_id=17 - POST: []
2026-02-16 03:17:11 - GET /index.php?server_id=1&channel_id=17 - POST: []