Telegram Bots als eigenständige Entität mit eigener Page
- Neue Tabelle 'telegram_bots' (bot_id, name, bot_token, webhook_secret, is_public)
- Automatische Migration bestehender Session-Telegram-Configs in telegram_bots
- Sessions verweisen via telegram_bot_id auf Bot (mehrere Sessions pro Bot möglich)
- Webhook-URL: /api/telegram/webhook/{botId} statt {sessionId}
- Eigene Telegram-Bot-Page (wie Agent/Cronjob/Session) statt Modal
- Bot-Page: Name, Token, Secret, Webhook-Verwaltung (registrieren/status/entfernen), Löschen
- Dashboard: Telegram Bots Section mit Cards (Name, maskierter Token, Session-Count)
- Session-Page: Bot-Picker (wie Agent-Picker) statt Token-Input, Chat-ID readonly + Unlink-Button
- Public-Flag: Bot kann von anderen Usern in ihren Sessions ausgewählt werden
- Vereinfacht: 1 Session = max. 1 Telegram Chat, allowed_chat_ids entfällt
- /start zeigt Chat-ID an, /unlink entfernt (Unlink nur über Web-UI)
- Nachrichten-Routing: Bot + Chat-ID → Session Lookup
This commit is contained in:
1 parent
3b7bdb7a20
commit
ec73ccd71e
13 files changed
+907
-371
No files matched your search
@@ -46,6 +46,47 @@ function buildSessionCard(session, agent) {
|
||||
}
|
||||
|
||||
|
||||
// ── Telegram Bot Card Helper ──
|
||||
|
||||
function buildTelegramBotCard(bot) {
|
||||
const card = document.createElement('div');
|
||||
card.className = 'card card-compact';
|
||||
|
||||
const badges = [];
|
||||
if (bot.isPublic) {
|
||||
badges.push('<span class="badge badge-feature"><i class="fa fa-globe"></i> Public</span>');
|
||||
}
|
||||
if (bot.isOwner === false) {
|
||||
badges.push('<span class="badge badge-off"><i class="fa fa-user"></i> Fremd</span>');
|
||||
}
|
||||
if (bot.sessionCount > 0) {
|
||||
badges.push(`<span class="badge badge-feature"><i class="fa fa-comment"></i> ${bot.sessionCount} ${bot.sessionCount === 1 ? 'Session' : 'Sessions'}</span>`);
|
||||
}
|
||||
|
||||
// Meta-Items nur anzeigen wenn Daten vorhanden
|
||||
const metaParts = [];
|
||||
if (bot.botToken) {
|
||||
const maskedToken = '•••' + bot.botToken.slice(-4);
|
||||
metaParts.push(`<span class="card-meta-item"><i class="fa fa-key"></i> ${esc(maskedToken)}</span>`);
|
||||
}
|
||||
if (bot.createdAt) {
|
||||
metaParts.push(`<span class="card-meta-item"><i class="fa fa-clock-o"></i> ${formatDate(bot.createdAt)}</span>`);
|
||||
}
|
||||
|
||||
card.innerHTML = `
|
||||
<div class="card-body">
|
||||
<div class="card-title-row">
|
||||
<span class="card-title"><i class="fa fa-paper-plane"></i> ${esc(bot.name)}</span>
|
||||
${badges.join('')}
|
||||
</div>
|
||||
${metaParts.length ? `<div class="card-meta">${metaParts.join('')}</div>` : ''}
|
||||
</div>
|
||||
`;
|
||||
|
||||
return card;
|
||||
}
|
||||
|
||||
|
||||
// ── Agent Card Helper ──
|
||||
// Erzeugt ein .card-Element für einen Agent (wiederverwendbar für Dashboard + Picker).
|
||||
|
||||
|
||||
Reference in new issue
Block a user