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():