import asyncio, sys, time
import websockets

ORIGIN="https://computernewb.com"
UA="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120 Safari/537.36"
PROXY="socks4://36.88.242.103:1080"

def enc(*e): return ",".join(f"{sum(1 if ord(c)<=0xFFFF else 2 for c in x)}.{x}" for x in e)+";"
def dec(msg):
    cps=list(msg); u16=[1 if ord(c)<=0xFFFF else 2 for c in cps]; out=[]; i=0; N=len(cps)
    while i<N:
        inst=[]
        while True:
            j=i; num=''
            while cps[j]!='.': num+=cps[j]; j+=1
            L=int(num); j+=1; k=j; c=0
            while c<L: c+=u16[k]; k+=1
            inst.append(''.join(cps[j:k])); i=k
            sep=cps[i]; i+=1
            if sep==';': break
        out.append(inst)
    return out

async def session(deadline):
    uri="wss://computernewb.com/collab-vm/vm0"
    async with websockets.connect(uri, subprotocols=["guacamole"], origin=ORIGIN,
            additional_headers={"User-Agent":UA}, proxy=PROXY, max_size=None, open_timeout=20) as ws:
        print("[connected]", file=sys.stderr)
        await ws.send(enc("rename")); await ws.send(enc("connect","vm0"))
        while time.monotonic() < deadline:
            msg=await asyncio.wait_for(ws.recv(), timeout=deadline-time.monotonic()+1)
            if isinstance(msg,bytes): continue
            for inst in dec(msg):
                op=inst[0]
                if op=="nop": await ws.send(enc("nop")); continue
                if op in ("png","sync","size","res","move","cursor","copy","cfill","cursor"): continue
                shown=[(e[:70]+"…" if len(e)>70 else e) for e in inst]
                print("  ".join(shown), flush=True)

async def main():
    deadline=time.monotonic()+120
    while time.monotonic()<deadline:
        try:
            await session(deadline)
        except Exception as ex:
            print(f"[reconnect: {type(ex).__name__}]", file=sys.stderr)
            await asyncio.sleep(2)

asyncio.run(main())
