38481-vm/index.php
Flatlogic Bot 2c48546b22 V2
2026-02-16 16:20:35 +00:00

215 lines
8.1 KiB
PHP

<?php
require_once __DIR__ . '/db/config.php';
function get_setting($key) {
$stmt = db()->prepare("SELECT setting_value FROM bot_settings WHERE setting_key = ?");
$stmt->execute([$key]);
return $stmt->fetchColumn() ?: '';
}
function save_setting($key, $value) {
$stmt = db()->prepare("UPDATE bot_settings SET setting_value = ? WHERE setting_key = ?");
$stmt->execute([$value, $key]);
}
$message = '';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$token = $_POST['discord_token'] ?? '';
$guild = $_POST['guild_id'] ?? '';
$channel = $_POST['voice_channel_id'] ?? '';
$alarm = $_POST['alarm_time'] ?? '';
save_setting('discord_token', $token);
save_setting('guild_id', $guild);
save_setting('voice_channel_id', $channel);
save_setting('alarm_time', $alarm);
// Also update JSON for the bot
$config = [
'discord_token' => $token,
'guild_id' => $guild,
'voice_channel_id' => $channel,
'alarm_time' => $alarm,
'last_voice_channel' => json_decode(get_setting('last_voice_channel'), true) ?: null
];
if (!is_dir(__DIR__ . '/data')) mkdir(__DIR__ . '/data', 0775, true);
file_put_contents(__DIR__ . '/data/config.json', json_encode($config, JSON_PRETTY_PRINT));
$message = 'Configuration saved successfully!';
}
$token = get_setting('discord_token');
$guildId = get_setting('guild_id');
$voiceId = get_setting('voice_channel_id');
$alarmTime = get_setting('alarm_time');
?>
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Discord Alarm Sahur — Dashboard</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap" rel="stylesheet">
<style>
:root {
--primary-bg: #f8f9fa;
--surface-bg: #ffffff;
--border-color: #e5e5e5;
--text-main: #111111;
--text-muted: #666666;
--accent: #007aff;
}
body {
font-family: 'Inter', system-ui, -apple-system, sans-serif;
background-color: var(--primary-bg);
color: var(--text-main);
padding: 2rem 1rem;
}
.container { max-width: 600px; }
.card {
background: var(--surface-bg);
border: 1px solid var(--border-color);
border-radius: 4px;
box-shadow: none;
margin-bottom: 1.5rem;
}
.card-header {
background: transparent;
border-bottom: 1px solid var(--border-color);
padding: 1rem 1.25rem;
font-weight: 600;
}
.btn-primary {
background-color: var(--text-main);
border-color: var(--text-main);
border-radius: 4px;
padding: 0.5rem 1rem;
font-weight: 500;
}
.btn-primary:hover {
background-color: #333;
border-color: #333;
}
.form-control {
border-radius: 4px;
border: 1px solid var(--border-color);
padding: 0.6rem;
}
.form-control:focus {
border-color: var(--accent);
box-shadow: 0 0 0 2px rgba(0, 122, 255, 0.1);
}
.status-dot {
height: 10px;
width: 10px;
background-color: #ccc;
border-radius: 50%;
display: inline-block;
margin-right: 5px;
}
.status-online { background-color: #28a745; }
.audio-preview {
background: #f1f1f1;
padding: 10px;
border-radius: 4px;
display: flex;
align-items: center;
justify-content: space-between;
}
h1 { font-size: 1.5rem; font-weight: 600; margin-bottom: 1.5rem; }
.hint { font-size: 0.85rem; color: var(--text-muted); margin-top: 0.25rem; }
</style>
</head>
<body>
<div class="container">
<?php
$bot_running = false;
$output = [];
exec("ps aux | grep 'node index.js' | grep -v grep", $output);
if (!empty($output)) {
$bot_running = true;
}
?>
<header class="d-flex justify-content-between align-items-center mb-4">
<h1>Alarm Sahur Bot</h1>
<div class="small text-muted">
<span class="status-dot <?= $bot_running ? 'status-online' : '' ?>"></span>
<?= $bot_running ? 'Bot Online' : 'System Standby' ?>
</div>
</header>
<?php if ($message): ?>
<div class="alert alert-success py-2 px-3 small border-0 rounded-1 mb-4" role="alert">
<?= htmlspecialchars($message) ?>
</div>
<?php endif; ?>
<div class="card">
<div class="card-header">Configuration</div>
<div class="card-body">
<form method="POST">
<div class="mb-3">
<label class="form-label small fw-medium">Discord Bot Token</label>
<input type="password" name="discord_token" class="form-control" value="<?= htmlspecialchars($token) ?>" placeholder="MTAyMzQ1Njc4OTAxMjM0NTY3OA...">
<div class="hint">Obtained from Discord Developer Portal.</div>
</div>
<div class="row">
<div class="col-md-6 mb-3">
<label class="form-label small fw-medium">Guild ID</label>
<input type="text" name="guild_id" class="form-control" value="<?= htmlspecialchars($guildId) ?>" placeholder="1234567890...">
</div>
<div class="col-md-6 mb-3">
<label class="form-label small fw-medium">Voice Channel ID</label>
<input type="text" name="voice_channel_id" class="form-control" value="<?= htmlspecialchars($voiceId) ?>" placeholder="9876543210...">
</div>
</div>
<div class="mb-3">
<label class="form-label small fw-medium">Alarm Time (HH:MM)</label>
<input type="time" name="alarm_time" class="form-control" value="<?= htmlspecialchars($alarmTime) ?>">
<div class="hint">Bot will automatically join the voice channel and play audio at this time.</div>
</div>
<button type="submit" class="btn btn-primary w-100 mt-2">Save Configuration</button>
</form>
</div>
</div>
<div class="card">
<div class="card-header d-flex justify-content-between align-items-center">
<span>Audio Asset</span>
<a href="audio_assets.php" class="btn btn-sm btn-outline-primary">Manage</a>
</div>
<div class="card-body">
<div class="audio-preview">
<span class="small fw-medium">sahur.mp3</span>
<audio id="sahurPlayer" src="assets/audio/sahur.mp3?v=<?= time() ?>"></audio>
<button class="btn btn-sm btn-outline-dark" onclick="document.getElementById('sahurPlayer').play()">Preview</button>
</div>
<div class="hint mt-2">File located at <code>assets/audio/sahur.mp3</code>.</div>
</div>
</div>
<div class="card">
<div class="card-header">Quick Start</div>
<div class="card-body small">
<ol class="ps-3 mb-0">
<li>Configure the Token and Channel IDs above.</li>
<li>Ensure <code>node_modules</code> are installed (run <code>npm install</code>).</li>
<li>Start the bot via <code>node index.js</code>.</li>
<li>Use <code>/testsahur</code> in your Discord server.</li>
</ol>
</div>
</div>
<footer class="text-center mt-5">
<p class="small text-muted">Flatlogic LAMP Engineer &copy; <?= date('Y') ?></p>
</footer>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>