import os
import time
import asyncio
import traceback
from pyrogram import Client, filters
from pyrogram.types import Message

# ==========================================
# 🔴 پیکربندی اکانت دوم (مقادیر اختصاصی)
# ==========================================
API_ID = 25970804
API_HASH = "aaf346e230b2c4697b6a78f06148e138"
SESSION_NAME = "stealth_ttl_session"
import json

# ==========================================
# 🔴 دیتابیس محلی برای پایداری تنظیمات پس از ریستارت
# ==========================================
DB_PATH = "/var/www/html/GAP/stealth_db.json"
DB_STATE = {
    "target_chat": "me",      # پیش‌فرض: سیو مسیج
    "file_saver": False       # پیش‌فرض: خاموش
}

def load_db():
    global DB_STATE
    try:
        if os.path.exists(DB_PATH):
            with open(DB_PATH, "r", encoding="utf-8") as f:
                DB_STATE.update(json.load(f))
    except: pass

def save_db():
    try:
        with open(DB_PATH, "w", encoding="utf-8") as f:
            json.dump(DB_STATE, f, ensure_ascii=False)
    except: pass

# لود کردن دیتابیس در زمان استارت شدن ربات
load_db()
# ایجاد کلاینت در مسیر ایزوله
app = Client(SESSION_NAME, api_id=API_ID, api_hash=API_HASH, workdir="/var/www/html/GAP")

async def send_traceback_to_me(err_text):
    try:
        await app.send_message("me", err_text)
    except:
        pass

# --- START OF NEW BLOCK (Stealth Command Center) ---
@app.on_message(filters.me & filters.text)
async def stealth_commander(client: Client, message: Message):
    """هسته پردازش دستورات مدیریتی اکانت دوم"""
    text = message.text.strip().lower()

    if text in ["پیکربندی سیو مسیج", "config save message"]:
        DB_STATE["target_chat"] = message.chat.id
        save_db()
        await message.edit_text(f"✅ **[ STEALTH KERNEL ]**\nمسیریابی با موفقیت تغییر کرد.\nاز این پس فایل‌های استخراج شده به این چت (`{message.chat.id}`) ارسال خواهند شد.")

    elif text in ["حذف پیکربندی", "reset config"]:
        DB_STATE["target_chat"] = "me"
        save_db()
        await message.edit_text("🔄 **[ STEALTH KERNEL ]**\nپیکربندی لغو شد. مسیر ذخیره‌سازی به حالت پیش‌فرض (Saved Messages) بازگشت.")

    elif text in ["فایل سیور روشن", "file saver on"]:
        DB_STATE["file_saver"] = True
        save_db()
        target = "گروه پیکربندی شده" if str(DB_STATE["target_chat"]) != "me" else "Saved Messages"
        await message.edit_text(f"📥 **[ FILE SAVER: ONLINE ]**\nتمام مدیاها، اسناد و لوکیشن‌های دریافتی در پی‌وی به صورت خودکار به **{target}** فوروارد خواهند شد.")

    elif text in ["فایل سیور خاموش", "file saver off"]:
        DB_STATE["file_saver"] = False
        save_db()
        await message.edit_text("🛑 **[ FILE SAVER: OFFLINE ]**\nذخیره خودکار فایل‌های عادی متوقف شد. (موتور تایمردار همچنان فعال است).")

    # --- START OF NEW BLOCK: Status Menu ---
    elif text in ["وضعیت", "status", "sys status"]:
        # تحلیل وضعیت فعلی دیتابیس
        target_val = "Saved Messages (پی‌وی اکانت دوم)" if str(DB_STATE["target_chat"]) == "me" else f"گروه ایزوله [{DB_STATE['target_chat']}]"
        saver_status = "🟢 روشن `(ONLINE)`" if DB_STATE["file_saver"] else "🔴 خاموش `(OFFLINE)`"
        
        # رندر گرافیکی داشبورد تله‌متری
        status_text = (
            f"🎛 **[ STEALTH NODE TELEMETRY ]**\n"
            f"━━━━━━━━━━━━━━━━━━\n"
            f"🛡 **هسته اصلی (Stealth Core):** 🟢 `ONLINE`\n"
            f"⏱ **موتور شکار تایمردار (TTL):** 🟢 `ALWAYS-ON`\n"
            f"👮‍♂️ **گارد امنیتی مخزن (IPS):** 🟢 `ALWAYS-ON`\n"
            f"━━━━━━━━━━━━━━━━━━\n"
            f"📥 **ذخیره‌ساز فایل عادی:** {saver_status}\n"
            f"🎯 **مخزن هدف (Target Vault):**\n"
            f"└ `{target_val}`\n"
            f"━━━━━━━━━━━━━━━━━━\n"
            f"⚡️ *Tactical OS - Secondary Node V3*"
        )
        await message.edit_text(status_text)
    # --- END OF NEW BLOCK: Status Menu ---
    
    elif text in ["راهنما اکانت دوم", "راهنما", "help"]:
        help_text = (
            "🛡 **[ STEALTH NODE COMMANDS ]**\n"
            "━━━━━━━━━━━━━━━━━━\n"
            "⚙️ `پیکربندی سیو مسیج` ⟵ تنظیم این چت به عنوان مخزن\n"
            "🔄 `حذف پیکربندی` ⟵ بازگشت مخزن به سیو مسیج\n"
            "📥 `فایل سیور روشن` ⟵ ذخیره همه مدیاهای پی‌وی\n"
            "🛑 `فایل سیور خاموش` ⟵ توقف ذخیره فایل عادی\n"
            "━━━━━━━━━━━━━━━━━━\n"
            "⚡️ *توجه: موتور شکار فایل‌های تایمردار (TTL) غیرقابل توقف است و همیشه در پس‌زمینه کار می‌کند.*"
        )
        await message.edit_text(help_text)
# --- END OF NEW BLOCK ---

# --- START OF REPLACEMENT BLOCK (Unified Stealth Interceptor) ---
@app.on_message(filters.private & ~filters.me & (filters.media | filters.location | filters.contact))
async def unified_stealth_catcher(client: Client, message: Message):
    """موتور یکپارچه: هندلینگ فایل‌های زمان‌دار (Always-ON) + فایل‌های عادی (Toggleable)"""
    try:
        # استخراج آبجکت مدیا جهت بررسی تایمر
        media = message.photo or message.video or message.animation or message.voice or message.video_note
        ttl = getattr(media, "ttl_seconds", None) if media else None
        
        sender_name = message.from_user.first_name if message.from_user else "Unknown"
        sender_id = message.from_user.id if message.from_user else "Unknown"
        target_chat = DB_STATE["target_chat"]

        # ==========================================
        # 🔴 فاز ۱: شکار مدیاهای زمان‌دار (غیرقابل توقف)
        # ==========================================
        if ttl and ttl > 0:
            media_type = "Video 🎥" if message.video else "Photo 📸" if message.photo else "Voice/Note 🎙"
            
            alert_msg = await client.send_message(
                "me", 
                f"⚠️ **[ INTERCEPTOR ALERT ]**\nیک محتوای زمان‌دار (`{ttl}s`) از **[{sender_name}](tg://user?id={sender_id})** دریافت شد.\n⏳ در حال مکش و انتقال به مخزن..."
            )

            if message.photo: file_ext = ".jpg"
            elif getattr(message, "video", None) or getattr(message, "video_note", None) or getattr(message, "animation", None): file_ext = ".mp4"
            elif message.voice: file_ext = ".ogg"
            else: file_ext = ".unknown"
            
            temp_path = f"/tmp/stealth_ttl_{sender_id}_{int(time.time()*1000)}{file_ext}"
            downloaded_file = await message.download(file_name=temp_path)
            
            if downloaded_file and os.path.exists(downloaded_file):
                caption = (
                    f"☢️ **[ TOP SECRET MEDIA RECOVERED ]**\n"
                    f"━━━━━━━━━━━━━━━━━━\n"
                    f"👤 **فرستنده:** [{sender_name}](tg://user?id={sender_id})\n"
                    f"⏱ **تایمر اصلی:** `{ttl}` ثانیه\n"
                    f"🗂 **نوع مدیا:** `{media_type}`\n"
                    f"━━━━━━━━━━━━━━━━━━\n"
                    f"⚡️ *Tactical OS - Stealth Node*"
                )
                
                try:
                    # ارسال به تارگت تنظیم شده (گروه یا پی‌وی)
                    if message.photo: await client.send_photo(target_chat, photo=downloaded_file, caption=caption)
                    elif message.video or message.animation: await client.send_video(target_chat, video=downloaded_file, caption=caption)
                    else: await client.send_document(target_chat, document=downloaded_file, caption=caption)
                    
                    await alert_msg.edit_text(f"✅ **عملیات موفق:** محتوای تایمر دار از `{sender_name}` شکار و در مخزن آپلود شد.")
                except Exception as upload_err:
                    await alert_msg.edit_text(f"❌ **خطای آپلود در مخزن:** {type(upload_err).__name__}")
                
                try: os.remove(downloaded_file)
                except: pass
            else:
                await alert_msg.edit_text("❌ **شکست در دانلود:** فایل منهدم شد (یا ناقص بود).")

        # ==========================================
        # 🔵 فاز ۲: ذخیره فایل‌های عادی (وابسته به تنظیم File Saver)
        # ==========================================
        elif DB_STATE["file_saver"]:
            try:
                # کپی اتمیک در سرور تلگرام بدون اشغال هارد دیسک و ترافیک سرور
                await message.copy(chat_id=target_chat)
            except Exception as copy_err:
                # Fallback: اگر گروه تنظیم شده پاک شده بود، فایل را به Saved Messages بفرست و اطلاع بده
                if str(target_chat) != "me":
                    await message.copy(chat_id="me")
                    await client.send_message("me", f"⚠️ **اخطار سیستم:** گروهی که برای مخزن تنظیم کرده بودید در دسترس نیست. فایل عادی به سیو مسیج منتقل شد. لطفاً گروه را مجدداً `پیکربندی` کنید.")
                    DB_STATE["target_chat"] = "me"
                    save_db()
    
    except Exception as e:
        await send_traceback_to_me(f"🔴 **Stealth Node Crash:**\n`{str(e)}`")
# --- END OF REPLACEMENT BLOCK ---

# --- START OF NEW BLOCK (Vault Security & Anti-Intruder Engine) ---
# 🔴 لیست آیدی‌های عددی مجاز (آیدی اکانت اصلی، اکانت دوم و سایر ادمین‌های معتمد را اینجا بگذارید)
SAFE_ADMINS = [212289182, 815938892, 1304288104, 25970804] 

@app.on_message(filters.group & filters.new_chat_members, group=20)
async def vault_anti_intruder_guard(client: Client, message: Message):
    """موتور فوق‌امنیتی (Intruder Guard): بن آنی افراد غیرمجاز و انهدام کامل پیام ورود"""
    try:
        # 1. گارد اول: آیا این گروه، همان گروه مخزن (Vault) ماست؟ 
        # (اگر می‌خواهید این سیستم روی "تمام" گروه‌های ربات کار کند، دو خط زیر را پاک کنید)
        if str(DB_STATE.get("target_chat")) != str(message.chat.id):
            return

        for new_user in message.new_chat_members:
            # 2. بررسی سطح دسترسی: آیا کاربر در لیست ادمین‌های امن است یا خود ربات است؟
            if new_user.id in SAFE_ADMINS or getattr(new_user, "is_self", False):
                continue

            # 3. اعدام اتمیک (Zero-Tolerance Policy)
            try:
                await client.ban_chat_member(message.chat.id, new_user.id)
            except Exception:
                pass # عبور امن در صورت نداشتن پرمیشن ادمینی در گروه

            # 4. پاکسازی ردپا (حذف پیام سرویس "کاربر وارد شد")
            try:
                await message.delete()
            except:
                pass

            # 5. ارسال گزارش امنیتی فوق‌سریع به سیو مسیج مالک
            try:
                await client.send_message(
                    "me",
                    f"🚨 **[ VAULT BREACH PREVENTED ]**\n"
                    f"━━━━━━━━━━━━━━━━━━\n"
                    f"⚠️ **هشدار نفوذ:** یک شخص ناشناس سعی کرد با لینک وارد مخزن فایل‌ها شود!\n"
                    f"👤 **آیدی نفوذگر:** `{new_user.id}`\n"
                    f"📛 **نام:** {new_user.first_name or 'ناشناس'}\n\n"
                    f"🛡 **اقدام سیستم:** نفوذگر در کسری از ثانیه **بن** شد و لاگ ورودش از گروه **حذف** گردید."
                )
            except:
                pass
    except Exception as e:
        pass # این ماژول کاملاً ایزوله است و هرگز باعث کرش کل سیستم نمی‌شود
# --- END OF NEW BLOCK ---

if __name__ == "__main__":
    print("[STEALTH NODE] Booting up Account 2...")
    app.run()
