From 4f847bd33dd8ef02f8078d33fe5dcacf997243bc Mon Sep 17 00:00:00 2001 From: Meleki Date: Sun, 8 Mar 2026 23:00:13 +0100 Subject: [PATCH] Telegram: Auto-Link bei /start und normalen Nachrichten MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Wenn eine Telegram-Nachricht von einem nicht verknüpften Chat eingeht: - Sucht nach Sessions mit diesem Bot, die noch keine Chat-ID haben - Genau 1 unverknüpfte Session → automatisch zuweisen + Bestätigung - 0 oder mehrere → Chat-ID anzeigen, manuell im Web-UI zuweisen Neue DB-Methode: FindUnlinkedSessionsForBot(botId) --- Services/DatabaseService.cs | 12 ++++++++--- Services/TelegramService.cs | 43 ++++++++++++++++++++++++++++++++----- 2 files changed, 47 insertions(+), 8 deletions(-) diff --git a/Services/DatabaseService.cs b/Services/DatabaseService.cs index 645e0ed..03307e9 100644 --- a/Services/DatabaseService.cs +++ b/Services/DatabaseService.cs @@ -1332,11 +1332,17 @@ public class DatabaseService { using var conn = CreateConnection(); var chatIdStr = chatId.ToString(); - // Erst exakte Chat-ID-Verknüpfung suchen - var session = await conn.QuerySingleOrDefaultAsync( + return await conn.QuerySingleOrDefaultAsync( "SELECT * FROM sessions WHERE telegram_bot_id = @botId AND telegram_chat_id = @chatIdStr AND is_deleted = 0", new { botId, chatIdStr }); - return session; + } + + public async Task> FindUnlinkedSessionsForBot(string botId) + { + using var conn = CreateConnection(); + return await conn.QueryAsync( + "SELECT * FROM sessions WHERE telegram_bot_id = @botId AND (telegram_chat_id IS NULL OR telegram_chat_id = '') AND is_deleted = 0", + new { botId }); } public async Task> GetUserSessions(string userId) diff --git a/Services/TelegramService.cs b/Services/TelegramService.cs index c7789b6..bdf19f6 100644 --- a/Services/TelegramService.cs +++ b/Services/TelegramService.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Net.Http; using System.Text; using System.Text.Json; @@ -54,10 +55,23 @@ public class TelegramService if (session == null) { - await SendMessage(chatId, bot.BotToken, - $"🔒 Keine Session mit diesem Chat verknüpft.\n\nDeine Chat-ID: `{chatId}`\nBitte weise diese Chat-ID im Web-UI einer Session zu.", - parseMode: "Markdown"); - return; + // Gibt es genau 1 unverknüpfte Session für diesen Bot? → Auto-Link + var unlinked = (await _db.FindUnlinkedSessionsForBot(bot.BotId)).ToList(); + if (unlinked.Count == 1) + { + session = unlinked[0]; + await _db.UpdateSessionTelegramChat(session.SessionId, chatId.ToString()); + var sessionName = session.Name ?? session.SessionId; + await SendMessage(chatId, bot.BotToken, + $"✅ Automatisch verbunden mit Session: {sessionName}"); + } + else + { + await SendMessage(chatId, bot.BotToken, + $"🔒 Keine Session mit diesem Chat verknüpft.\n\nDeine Chat-ID: `{chatId}`\nBitte weise diese Chat-ID im Web-UI einer Session zu.", + parseMode: "Markdown"); + return; + } } if (text.StartsWith("/")) @@ -85,7 +99,26 @@ public class TelegramService return; } - // Nicht verknüpft – Chat-ID anzeigen + // Nicht verknüpft – gibt es Sessions mit diesem Bot ohne Chat-ID? + var unlinked = (await _db.FindUnlinkedSessionsForBot(bot.BotId)).ToList(); + + if (unlinked.Count == 1) + { + // Genau 1 Session ohne Chat-ID → automatisch zuweisen + var target = unlinked[0]; + await _db.UpdateSessionTelegramChat(target.SessionId, chatId.ToString()); + var sessionName = target.Name ?? target.SessionId; + await SendMessage(chatId, bot.BotToken, + $"✅ *Automatisch verbunden mit Session: {EscapeMd(sessionName)}*\n\n" + + "Du kannst jetzt einfach drauflos schreiben\\!\n\n" + + "Befehle:\n" + + "/clear – History archivieren\n" + + "/status – Aktuelle Session\\-Info", + parseMode: "MarkdownV2"); + return; + } + + // Keine oder mehrere unverknüpfte Sessions → Chat-ID anzeigen await SendMessage(chatId, bot.BotToken, $"📋 Deine Chat-ID: `{chatId}`\n\n" + "Bitte weise diese Chat-ID im Web-UI einer Session zu, " +