class TestMinecraftQuerier: def setup_method(self): self.querier = ServerQuerier(Connection()) def test_handshake(self): self.querier.connection.receive(bytearray.fromhex("090000000035373033353037373800")) self.querier.handshake() assert self.querier.connection.flush() == bytearray.fromhex("FEFD090000000000000000") assert self.querier.challenge == 570350778 def test_query(self): self.querier.connection.receive( bytearray.fromhex( "00000000000000000000000000000000686f73746e616d650041204d696e656372616674205365727665720067616d657479706500534d500067616d655f6964004d494e4543524146540076657273696f6e00312e3800706c7567696e7300006d617000776f726c64006e756d706c61796572730033006d6178706c617965727300323000686f7374706f727400323535363500686f73746970003139322e3136382e35362e31000001706c617965725f000044696e6e6572626f6e6500446a696e6e69626f6e650053746576650000" ) ) response = self.querier.read_query() assert self.querier.connection.flush() == bytearray.fromhex("FEFD00000000000000000000000000") assert response.raw == { "hostname": "A Minecraft Server", "gametype": "SMP", "game_id": "MINECRAFT", "version": "1.8", "plugins": "", "map": "world", "numplayers": "3", "maxplayers": "20", "hostport": "25565", "hostip": "192.168.56.1", } assert response.players.names == ["Dinnerbone", "Djinnibone", "Steve"]
class TestQuerier(TestCase): def setUp(self): self.querier = ServerQuerier(Connection()) def test_handshake(self): self.querier.connection.receive(bytearray.fromhex("090000000035373033353037373800")) self.querier.handshake() self.assertEqual(self.querier.connection.flush(), bytearray.fromhex("FEFD090000000000000000")) self.assertEqual(self.querier.challenge, 570350778) def test_query(self): self.querier.connection.receive(bytearray.fromhex("00000000000000000000000000000000686f73746e616d650041204d696e656372616674205365727665720067616d657479706500534d500067616d655f6964004d494e4543524146540076657273696f6e00312e3800706c7567696e7300006d617000776f726c64006e756d706c61796572730033006d6178706c617965727300323000686f7374706f727400323535363500686f73746970003139322e3136382e35362e31000001706c617965725f000044696e6e6572626f6e6500446a696e6e69626f6e650053746576650000")) response = self.querier.read_query() self.assertEqual(self.querier.connection.flush(), bytearray.fromhex("FEFD00000000000000000000000000")) self.assertEqual(response.raw, { "hostname": "A Minecraft Server", "gametype": "SMP", "game_id": "MINECRAFT", "version": "1.8", "plugins": "", "map": "world", "numplayers": "3", "maxplayers": "20", "hostport": "25565", "hostip": "192.168.56.1", }) self.assertEqual(response.players.names, ["Dinnerbone", "Djinnibone", "Steve"])
def query(self, tries: int = 3): """Checks the status of a Minecraft Java Edition server via the query protocol. :param int tries: How many times to retry if it fails. :return: Query status information in a `QueryResponse` instance. :rtype: QueryResponse """ exception = None host = self.host try: answers = dns.resolver.query(host, "A") if len(answers): answer = answers[0] host = str(answer).rstrip(".") except Exception as e: pass for attempt in range(tries): try: connection = UDPSocketConnection((host, self.port)) querier = ServerQuerier(connection) querier.handshake() return querier.read_query() except Exception as e: exception = e else: raise exception
def query(self, retries=3): exception = None for attempt in range(retries): try: connection = UDPSocketConnection((self.host, self.port)) querier = ServerQuerier(connection) querier.handshake() return querier.read_query() except Exception as e: exception = e else: raise exception
class TestHandshake: def setup_method(self): self.querier = ServerQuerier(Connection()) def test_session_id(self): def session_id(): return 0x01010101 self.querier.connection.receive(bytearray.fromhex("090000000035373033353037373800")) self.querier._generate_session_id = Mock() self.querier._generate_session_id = session_id self.querier.handshake() conn_bytes = self.querier.connection.flush() assert conn_bytes[:3] == bytearray.fromhex("FEFD09") assert conn_bytes[3:] == session_id().to_bytes(4, byteorder="big") assert self.querier.challenge == 570350778
def query(self, retries=3): exception = None host = self.host try: answers = dns.resolver.query(host, "A") if len(answers): answer = answers[0] host = str(answer).rstrip(".") except Exception as e: pass for attempt in range(retries): try: connection = UDPSocketConnection((host, self.port)) querier = ServerQuerier(connection) querier.handshake() return querier.read_query() except Exception as e: exception = e else: raise exception
def setUp(self): self.querier = ServerQuerier(Connection())
def setup_method(self): self.querier = ServerQuerier(Connection())