From 102baa0ad92e0f1cf728e26ceb8f79b4f7281cff Mon Sep 17 00:00:00 2001 From: "info@pi-farm.de" Date: Sat, 7 Mar 2026 21:29:47 +0000 Subject: [PATCH] main.py aktualisiert --- main.py | 42 ++++++++++++++++++++++++++++-------------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/main.py b/main.py index 756a2fb..aa9964e 100644 --- a/main.py +++ b/main.py @@ -172,20 +172,33 @@ async def get_ai_response(user_input, system_prompt): return ai_msg async def handle_telegram_message(update: Update, context: ContextTypes.DEFAULT_TYPE): - # Sicherheits-Check: Nur deine Chat-ID wird akzeptiert - if str(update.effective_chat.id) != ALLOWED_ID: - await update.message.reply_text("Zugriff verweigert. 🔒") - return - - user_msg = update.message.text + # Den eigenen @Benutzernamen des Bots dynamisch abfragen + bot_username = f"@{context.bot.username}" - # "Tippt..." Status in Telegram anzeigen (schöne UX) + chat_type = update.effective_chat.type + user_msg = update.message.text + user_id = str(update.message.from_user.id) + + # 1. Gruppen-Logik: Nur reagieren, wenn der Bot @erwähnt wird + if chat_type in ['group', 'supergroup']: + if bot_username not in user_msg: + return # Bot wurde nicht erwähnt, Nachricht ignorieren + + # Den @Namen aus dem Text entfernen, damit die KI nicht verwirrt wird + user_msg = user_msg.replace(bot_username, "").strip() + else: + # Im Einzelchat kann optional weiterhin nur der Admin zugelassen werden. + # Wenn du willst, dass auch andere den Bot privat nutzen können, entferne diesen Block: + if user_id != ALLOWED_ID: + await update.message.reply_text("Zugriff auf den privaten Chat verweigert. 🔒") + return + + # Tipp-Status anzeigen await update.message.reply_chat_action(action="typing") - # 1. KI Antwort holen + # 2. KI fragen ai_response = await get_ai_response(user_msg, get_system_prompt()) - # 2. Befehle extrahieren commands = re.findall(r'(.*?)', ai_response, re.I | re.S) clean_msg = re.sub(r'.*?', '', ai_response, flags=re.I | re.S).strip() @@ -193,8 +206,12 @@ async def handle_telegram_message(update: Update, context: ContextTypes.DEFAULT_ if clean_msg: await update.message.reply_text(clean_msg) - # 3. Befehle ausführen und Ergebnisse als Telegram-Nachricht senden + # 3. Befehle ausführen (mit strengem Sicherheits-Check!) if commands: + if user_id != ALLOWED_ID: + await update.message.reply_text("⚠️ **Sicherheits-Sperre:** Die KI wollte einen Server-Befehl ausführen, aber du hast keine Administrator-Rechte dafür.") + return + for target, cmd in commands: await update.message.reply_text(f"⏳ Führe aus auf *{target}*:\n`{cmd}`", parse_mode='Markdown') @@ -204,7 +221,6 @@ async def handle_telegram_message(update: Update, context: ContextTypes.DEFAULT_ conn.close() if n: - # Befehl ausführen und Output abfangen try: proc = await asyncio.create_subprocess_shell( f"ssh -o StrictHostKeyChecking=no {n['user']}@{n['ip']} '{cmd}'", @@ -214,17 +230,15 @@ async def handle_telegram_message(update: Update, context: ContextTypes.DEFAULT_ stdout, _ = await proc.communicate() output = stdout.decode('utf-8', errors='ignore').strip() - # Ergebnis an Telegram senden (abgeschnitten auf 4000 Zeichen, da Telegram Limits hat) result_text = output[:4000] if output else "✅ Befehl ohne Output ausgeführt." await update.message.reply_text(f"💻 **Output von {n['name']}:**\n```\n{result_text}\n```", parse_mode='Markdown') - # Auch ins KI-Gedächtnis schreiben chat_history.append({"role": "user", "content": f"[SYSTEM] Befehl '{cmd}' auf {target} fertig:\n{result_text}"}) except Exception as e: await update.message.reply_text(f"❌ Fehler bei der Ausführung: {e}") else: await update.message.reply_text(f"⚠️ Node '{target}' nicht in der Datenbank gefunden.") - + # --- FASTAPI LIFESPAN EVENTS (Bot starten/stoppen) --- @app.on_event("startup") async def startup_event():