Ejemplo n.º 1
0
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"]
Ejemplo n.º 2
0
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"])
Ejemplo n.º 3
0
    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
Ejemplo n.º 4
0
 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
Ejemplo n.º 5
0
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
Ejemplo n.º 6
0
 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
Ejemplo n.º 7
0
 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
Ejemplo n.º 8
0
 def setUp(self):
     self.querier = ServerQuerier(Connection())
Ejemplo n.º 9
0
 def setUp(self):
     self.querier = ServerQuerier(Connection())
Ejemplo n.º 10
0
 def setup_method(self):
     self.querier = ServerQuerier(Connection())