import asyncio, websockets

discord_socket, client_socket = None, None
gateway = "wss://gateway.discord.gg/?v=8&encoding=json"

async def listener(socket: websockets.WebSocketClientProtocol, path):
    global client_socket, discord_socket
    client_socket = socket

    if discord_socket != None:
        await socket.close()
        return
        
    # Connect to the gateway
    asyncio.get_event_loop().create_task(sender())
    while not discord_socket: await asyncio.sleep(1)
    print("Connected to Roblox")

    while True:
        try:
            message = await socket.recv()
            await discord_socket.send(message)
        except Exception as e:
            print("Disconnected from Roblox,", e)
            await discord_socket.close()
            discord_socket = None
            break

async def sender():
    global discord_socket
    async with websockets.connect(gateway) as socket:
        discord_socket = socket
        print("Connected to Gateway")
        while True:
            try:
                message = await socket.recv()
                await client_socket.send(message)
            except Exception as e:
                print("Disconnected from Gateway,", e)
                break

print("Waiting Roblox connection...")
asyncio.get_event_loop().run_until_complete(websockets.serve(listener, "localhost", 8765))
asyncio.get_event_loop().run_forever()