Exemple #1
0
async def runClient():
    async with websockets.connect('ws://127.0.0.1:5001/sc2api') as websocket:
        await websocket.send(makeJoinGameRequest().SerializeToString())

        response = sc_pb.Response()
        response_bytes = await websocket.recv()
        response.ParseFromString(response_bytes)
        print("< {}".format(response))

        still_going = True
        while still_going:
            await websocket.send(makeObservationRequest().SerializeToString())

            response = sc_pb.Response()
            response_bytes = await websocket.recv()
            response.ParseFromString(response_bytes)
            print("< {}".format(response))
            if len(response.observation.player_result) > 0:
                still_going = False

            await websocket.send(makeStepRequest().SerializeToString())

            response = sc_pb.Response()
            response_bytes = await websocket.recv()
            response.ParseFromString(response_bytes)
            print("< {}".format(response))

        await websocket.send(makeLeaveRequest().SerializeToString())

        response = sc_pb.Response()
        response_bytes = await websocket.recv()
        response.ParseFromString(response_bytes)
        print("< {}".format(response))
    async def __request(self, request):
        logger.debug(f"Sending request: {request !r}")
        try:
            await self._ws.send_bytes(request.SerializeToString())
        except TypeError:
            logger.exception("Cannot send: Connection already closed.")
            raise ConnectionAlreadyClosed("Connection already closed.")
        logger.debug(f"Request sent")

        response = sc_pb.Response()
        try:
            response_bytes = await self._ws.receive_bytes()
        except TypeError:
            logger.exception("Cannot receive: Connection already closed.")
            raise ConnectionAlreadyClosed("Connection already closed.")
        except asyncio.CancelledError:
            # If request is sent, the response must be received before reraising cancel
            try:
                await self._ws.receive_bytes()
            except asyncio.CancelledError:
                logger.critical(
                    "Requests must not be cancelled multiple times")
                sys.exit(2)
            raise

        response.ParseFromString(response_bytes)
        logger.debug(f"Response received")
        return response
Exemple #3
0
    async def _execute(self, **kwargs):
        assert len(kwargs) == 1, "Only one request allowed"
        request = sc_pb.Request(**kwargs)

        # if len(repr(request)) < 200:
        #     print(">", repr(request))
        # else:
        #     print(">", repr(request)[:200]+"...")

        await self._ws.send(request.SerializeToString())

        response = sc_pb.Response()
        response_bytes = await self._ws.recv()
        response.ParseFromString(response_bytes)

        # if len(repr(response)) < 200:
        #     print("<", repr(response))
        # else:
        #     print("<", repr(response)[:200])
        #     print("...")

        self._status = Status(response.status)

        if response.error:
            # if response.HasField("error_details"):
            #     raise ProtocolError(f"{response.error}: {response.error_details}")
            # else:
            raise ProtocolError(f"{response.error}")

        return response
Exemple #4
0
def doCommand(sc2_socket, command, *arguments):
    # log.debug("Attempting to send command %s" % command)
    sc2_socket.send(command(*arguments).SerializeToString())
    # log.debug("Sent command %s" % command)
    response = sc2api_pb2.Response()
    # log.debug("Awaiting response from sc2")
    response_bytes = sc2_socket.recv()
    response.ParseFromString(response_bytes)
    # log.debug("Received response:\n%s" % response)
    return response
 def _read(self):
     """Actually read the response and parse it, returning a Response."""
     with sw("read_response"):
         with catch_websocket_connection_errors():
             response_str = self._sock.recv()
     if not response_str:
         raise ProtocolError("Got an empty response from SC2.")
     response = sc_pb.Response()
     with sw("parse_response"):
         response.ParseFromString(response_str)
     return response
Exemple #6
0
    async def __request(self, request):
        logger.debug(f"Sending request: {request !r}")
        try:
            await self._ws.send_bytes(request.SerializeToString())
        except TypeError:
            logger.exception("Cannot send: Connection already closed.")
            raise ConnectionAlreadyClosed("Connection already closed.")
        logger.debug(f"Request sent")

        response = sc_pb.Response()
        try:
            response_bytes = await self._ws.receive_bytes()
        except TypeError:
            logger.exception("Cannot receive: Connection already closed.")
            raise ConnectionAlreadyClosed("Connection already closed.")
        response.ParseFromString(response_bytes)
        logger.debug(f"Response received")
        return response
Exemple #7
0
    async def parse_response(self, response_bytes):
        response = sc_pb.Response()
        response.ParseFromString(response_bytes)

        if not response.HasField("status"):
            logger.critical("Proxy: RESPONSE HAS NO STATUS {response}")
        else:
            new_status = Status(response.status)
            if new_status != self.controller._status:
                logger.info(
                    f"Controller({self.player.name}): {self.controller._status}->{new_status}"
                )
                self.controller._status = new_status

        if self.player_id is None:
            if response.HasField("join_game"):
                self.player_id = response.join_game.player_id
                logger.info(
                    f"Proxy({self.player.name}): got join_game for {self.player_id}"
                )

        if self.result is None:
            if response.HasField("observation"):
                obs: sc_pb.ResponseObservation = response.observation
                if obs.player_result:
                    self.result = {
                        pr.player_id: Result(pr.result)
                        for pr in obs.player_result
                    }
                elif (self.timeout_loop and obs.HasField("observation")
                      and obs.observation.game_loop > self.timeout_loop):
                    self.result = {i: Result.Tie for i in range(1, 3)}
                    logger.info(f"Proxy({self.player.name}) timing out")
                    act = [
                        sc_pb.Action(action_chat=sc_pb.ActionChat(
                            message="Proxy: Timing out"))
                    ]
                    await self.controller._execute(action=sc_pb.RequestAction(
                        actions=act))
        return response
Exemple #8
0
    async def _execute(self, **kwargs):
        assert len(kwargs) == 1, "Only one request allowed"
        request = sc_pb.Request(**kwargs)

        await self._ws.send(request.SerializeToString())

        response = sc_pb.Response()
        try:
            response_bytes = await self._ws.recv()
        except websockets.exceptions.ConnectionClosed:
            raise ProtocolError("Connection already closed.")
        response.ParseFromString(response_bytes)

        self._status = Status(response.status)

        if response.error:
            # if response.HasField("error_details"):
            #     raise ProtocolError(f"{response.error}: {response.error_details}")
            # else:
            raise ProtocolError(f"{response.error}")

        return response
Exemple #9
0
 def read(self):
     response_str = self.conn.recv()
     response = sc_pb.Response()
     response.ParseFromString(response_str)
     return response