From 08c368be12060b8f944da71d220cba751b83688f Mon Sep 17 00:00:00 2001 From: Nathan Adams Date: Sun, 7 Sep 2014 00:59:29 +0200 Subject: [PATCH] Expose query through server.query_server() --- mcstatus/server.py | 11 +++++++++-- mcstatus/tests/test_server.py | 29 +++++++++++++++++++++++++++-- 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/mcstatus/server.py b/mcstatus/server.py index 832883a..c8eab3a 100644 --- a/mcstatus/server.py +++ b/mcstatus/server.py @@ -1,7 +1,8 @@ import json from mcstatus.pinger import ServerPinger -from mcstatus.protocol.connection import TCPSocketConnection +from mcstatus.protocol.connection import TCPSocketConnection, UDPSocketConnection +from mcstatus.querier import ServerQuerier class MinecraftServer: @@ -13,4 +14,10 @@ class MinecraftServer: connection = TCPSocketConnection((self.host, self.port)) pinger = ServerPinger(connection, host=self.host, port=self.port, **kwargs) pinger.handshake() - return pinger.read_status(), pinger.test_ping() \ No newline at end of file + return pinger.read_status(), pinger.test_ping() + + def query_server(self): + connection = UDPSocketConnection((self.host, self.port)) + querier = ServerQuerier(connection) + querier.handshake() + return querier.read_query() \ No newline at end of file diff --git a/mcstatus/tests/test_server.py b/mcstatus/tests/test_server.py index 0121cdb..56bf6d5 100644 --- a/mcstatus/tests/test_server.py +++ b/mcstatus/tests/test_server.py @@ -1,6 +1,6 @@ from unittest import TestCase -from mock import patch +from mock import patch, Mock from mcstatus.protocol.connection import Connection from mcstatus.server import MinecraftServer @@ -21,4 +21,29 @@ class TestMinecraftServer(TestCase): self.assertEqual(self.socket.flush(), bytearray.fromhex("0F002F096C6F63616C686F737463DD01010009010000000001C54246")) self.assertEqual(self.socket.remaining(), 0, msg="Data is pending to be read, but should be empty") self.assertEqual(info.raw, {"description":"A Minecraft Server","players":{"max":20,"online":0},"version":{"name":"1.8","protocol":47}}) - self.assertTrue(latency >= 0) \ No newline at end of file + self.assertTrue(latency >= 0) + + def test_query_server(self): + self.socket.receive(bytearray.fromhex("090000000035373033353037373800")) + self.socket.receive(bytearray.fromhex("00000000000000000000000000000000686f73746e616d650041204d696e656372616674205365727665720067616d657479706500534d500067616d655f6964004d494e4543524146540076657273696f6e00312e3800706c7567696e7300006d617000776f726c64006e756d706c61796572730033006d6178706c617965727300323000686f7374706f727400323535363500686f73746970003139322e3136382e35362e31000001706c617965725f000044696e6e6572626f6e6500446a696e6e69626f6e650053746576650000")) + + self.socket.remaining = Mock() + self.socket.remaining.side_effect = [15, 208] + + with patch("mcstatus.server.UDPSocketConnection") as connection: + connection.return_value = self.socket + info = self.server.query_server() + + self.assertEqual(self.socket.flush(), bytearray.fromhex("FEFD090000000000000000FEFD000000000021FEDCBA00000000")) + self.assertEqual(info.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", + }) \ No newline at end of file