@@ -306,6 +306,23 @@ pre.raw-line { background: var(--bs-tertiary-bg); padding: .75rem; border-radius
|
||||
<small id="tokenSaveStatus" class="ms-2"></small>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card mb-3">
|
||||
<div class="card-header"><i class="bi bi-telegram me-1"></i>Telegram Notifications</div>
|
||||
<div class="card-body">
|
||||
<p class="small text-secondary">Send alerts to a Telegram chat via a bot.</p>
|
||||
<div class="mb-2">
|
||||
<label class="form-label">Bot Token</label>
|
||||
<input type="text" class="form-control" id="telegramBotToken" placeholder="123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11">
|
||||
</div>
|
||||
<div class="mb-2">
|
||||
<label class="form-label">Chat ID</label>
|
||||
<input type="text" class="form-control" id="telegramChatId" placeholder="-1001234567890">
|
||||
</div>
|
||||
<button class="btn btn-primary btn-sm" id="saveTelegramBtn"><i class="bi bi-floppy"></i> Save</button>
|
||||
<small id="telegramSaveStatus" class="ms-2"></small>
|
||||
<button class="btn btn-outline-secondary btn-sm ms-2" id="testTelegramBtn"><i class="bi bi-send"></i> Test</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="card-header"><i class="bi bi-info-circle me-1"></i>How to get your user token</div>
|
||||
<div class="card-body small">
|
||||
@@ -873,6 +890,12 @@ async function loadSettings() {
|
||||
const tokens = res.tokens || [];
|
||||
document.getElementById('allowedTokensInput').value = tokens.join('\n');
|
||||
} catch (e) { console.error('load tokens error', e); }
|
||||
|
||||
try {
|
||||
const res = await api('/config/telegram');
|
||||
document.getElementById('telegramBotToken').value = res.bot_token || '';
|
||||
document.getElementById('telegramChatId').value = res.chat_id || '';
|
||||
} catch (e) { console.error('load telegram error', e); }
|
||||
}
|
||||
|
||||
document.getElementById('saveTokensBtn').addEventListener('click', async () => {
|
||||
@@ -897,6 +920,43 @@ document.getElementById('saveTokensBtn').addEventListener('click', async () => {
|
||||
}
|
||||
});
|
||||
|
||||
document.getElementById('saveTelegramBtn').addEventListener('click', async () => {
|
||||
const botToken = document.getElementById('telegramBotToken').value.trim();
|
||||
const chatId = document.getElementById('telegramChatId').value.trim();
|
||||
const statusEl = document.getElementById('telegramSaveStatus');
|
||||
statusEl.textContent = 'Saving...';
|
||||
statusEl.className = 'ms-2 text-secondary';
|
||||
try {
|
||||
await api('/config/telegram', {
|
||||
method: 'PUT',
|
||||
body: JSON.stringify({ bot_token: botToken, chat_id: chatId }),
|
||||
});
|
||||
statusEl.textContent = 'Saved';
|
||||
statusEl.className = 'ms-2 text-success';
|
||||
toast('Telegram config saved');
|
||||
setTimeout(() => { statusEl.textContent = ''; }, 3000);
|
||||
} catch (e) {
|
||||
statusEl.textContent = 'Failed';
|
||||
statusEl.className = 'ms-2 text-danger';
|
||||
toast('Failed to save Telegram config', 'danger');
|
||||
}
|
||||
});
|
||||
|
||||
document.getElementById('testTelegramBtn').addEventListener('click', async () => {
|
||||
const btn = document.getElementById('testTelegramBtn');
|
||||
btn.disabled = true;
|
||||
btn.innerHTML = '<span class="spinner-border spinner-border-sm"></span> Sending...';
|
||||
try {
|
||||
await api('/ingest', {
|
||||
method: 'POST',
|
||||
body: JSON.stringify({ line: 'Jakach Logging: test notification from settings', source: 'test' }),
|
||||
});
|
||||
toast('Test alert sent. Check Telegram.');
|
||||
} catch (e) { toast('Failed to send test', 'danger'); }
|
||||
btn.disabled = false;
|
||||
btn.innerHTML = '<i class="bi bi-send"></i> Test';
|
||||
});
|
||||
|
||||
// --- LOGS ---
|
||||
async function loadLogs(query) {
|
||||
if (!query) {
|
||||
|
||||
Reference in New Issue
Block a user