class GatewayClient: def __init__(self, address, port, timeout=None): self.address = address self.port = port self.timeout = timeout self._messageFactory = GatewayMessageFactory() self._connection = None def __enter__(self): self.connect() return self def __exit__(self, exc_type, exc_value, traceback): self.disconnect() def _getUrl(self): return "ws://{}:{}".format(self.address, self.port) def isConnected(self): return self._connection != None and self._connection.connected def connect(self): if self.isConnected(): raise GatewayClientError("already connected") try: self._connection = create_connection(self._getUrl(), timeout=self.timeout) except Exception as e: raise GatewayClientError("Connect to '{}' failed: {}".format(self._getUrl(), e)) def disconnect(self): if self.isConnected(): self._connection.close() def loginWithSteamId(self, steamId): if not self._connection.connected: raise GatewayClientError("not connected") request = LoginRequestMessage() request.handlingType = LoginRequestMessage.WITH_STEAM_ID request.steamId = steamId return self._sendRequest(request, LoginResponseMessage) def _sendRequest(self, request, expectedResponseClass): requestData = self._messageFactory.encodeMessage(request) self._connection.send_binary(requestData) responseData = self._connection.recv() responseMessageId, responseMessage = self._messageFactory.decodeMessage(responseData) if not isinstance(responseMessage, expectedResponseClass): raise GatewayClientError("response received expected to be of type {} but is of type {}".format(expectedResponseClass, response.__class__)) return responseMessage
def __init__(self, address, port, timeout=None): self.address = address self.port = port self.timeout = timeout self._messageFactory = GatewayMessageFactory() self._connection = None