import requests, json, urllib3, time
try:
    import msgpack
except ImportError:
    print("pip3 install msgpack")
    exit()
urllib3.disable_warnings()

# Celujemy w port Twojej mapy (2137)
URL = "http://45.134.108.204:2137/mtr/api/map/updates"

def main():
    print("=== OPERACJA: MAGIC-MTR ULTIMATE STREAM DECODER ===")
    session = requests.Session()
    
    try:
        print("[1] Pobieranie surowego strumienia danych...")
        r = session.get(URL, verify=False, timeout=10)
        print(f"[+] Otrzymano {len(r.content)} bajtów.")

        if len(r.content) == 0:
            print("[-] Serwer nic nie wysłał.")
            return

        print("[2] Dekodowanie strumieniowe (Unpacker)...")
        unpacker = msgpack.Unpacker(raw=False)
        unpacker.feed(r.content)
        
        found_vehicles = []
        server_time = 0

        for obj in unpacker:
            if isinstance(obj, dict):
                # Szukamy czasu serwera do synchronizacji
                if 'currentTime' in obj:
                    server_time = obj['currentTime']
                
                # Szukamy pociągów (MAGIC i MTR trzymają je tutaj)
                data_part = obj.get('data', {})
                if isinstance(data_part, dict):
                    for key in ['vehicles', 'trains', 'v']:
                        if key in data_part and data_part[key]:
                            found_vehicles.extend(data_part[key])
                elif isinstance(obj.get('vehicles'), list):
                    found_vehicles.extend(obj['vehicles'])

        if found_vehicles:
            print(f"✅ SUKCES! Znaleziono {len(found_vehicles)} pociągów w strumieniu!")
            print("\n=== DANE PIERWSZEGO POCIĄGU ===")
            print(json.dumps(found_vehicles[0], indent=4, ensure_ascii=False))
            return

        # Jeśli po GET nic nie ma, robimy agresywny POST z SYNC
        if server_time > 0:
            print(f"[3] Brak pojazdów w GET. Próba POST (SyncTime: {server_time})...")
            payload = {
                "lastUpdated": server_time - 5000, # Prosimy o zmiany z ostatnich 5s
                "x": 0, "z": 0, "radius": 100000
            }
            r_post = session.post(URL, json=payload, verify=False, timeout=10)
            
            unpacker_post = msgpack.Unpacker(raw=False)
            unpacker_post.feed(r_post.content)
            for obj in unpacker_post:
                if isinstance(obj, dict):
                    d = obj.get('data', {})
                    if isinstance(d, dict) and d.get('vehicles'):
                        print(f"✅ MAMY TO PRZEZ POST! Znaleziono: {len(d['vehicles'])}")
                        print(json.dumps(d['vehicles'][0], indent=4, ensure_ascii=False))
                        return

        print("[-] Przeszukano cały strumień, ale pociągów brak. Prawdopodobnie są w innym kanale.")
        
    except Exception as e:
        print(f"[-] Błąd krytyczny: {e}")

if __name__ == "__main__":
    main()
