diff --git a/mcstatus/querier.py b/mcstatus/querier.py index 1782a63..4b5db70 100644 --- a/mcstatus/querier.py +++ b/mcstatus/querier.py @@ -62,6 +62,29 @@ class ServerQuerier: class QueryResponse: + class Players: + def __init__(self, online, max, names): + self.online = int(online) + self.max = int(max) + self.names = names + + class Software: + def __init__(self, version, plugins): + self.version = version + self.brand = "vanilla" + self.plugins = [] + + if plugins: + parts = plugins.split(":", 1) + self.brand = parts[0].strip() + + if len(parts) == 2: + self.plugins = map(lambda s: s.strip(), parts[1].split(";")) + + def __init__(self, raw, players): self.raw = raw - self.players = players \ No newline at end of file + self.motd = raw["hostname"] + self.map = raw["map"] + self.players = QueryResponse.Players(raw["numplayers"], raw["maxplayers"], players) + self.software = QueryResponse.Software(raw["version"], raw["plugins"]) \ No newline at end of file diff --git a/mcstatus/tests/test_querier.py b/mcstatus/tests/test_querier.py index 20bf2d5..adc6ead 100644 --- a/mcstatus/tests/test_querier.py +++ b/mcstatus/tests/test_querier.py @@ -1,7 +1,7 @@ from unittest import TestCase from mcstatus.protocol.connection import Connection -from mcstatus.querier import ServerQuerier +from mcstatus.querier import ServerQuerier, QueryResponse class TestQuerier(TestCase): @@ -32,4 +32,63 @@ class TestQuerier(TestCase): "hostport": "25565", "hostip": "192.168.56.1", }) - self.assertEqual(response.players, ["Dinnerbone", "Djinnibone", "Steve"]) \ No newline at end of file + self.assertEqual(response.players.names, ["Dinnerbone", "Djinnibone", "Steve"]) + + +class TestQueryResponse(TestCase): + def setUp(self): + self.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.players = ["Dinnerbone", "Djinnibone", "Steve"] + + def test_valid(self): + response = QueryResponse(self.raw, self.players) + + self.assertEqual(response.motd, "A Minecraft Server") + self.assertEqual(response.map, "world") + self.assertEqual(response.players.online, 3) + self.assertEqual(response.players.max, 20) + self.assertEqual(response.players.names, ["Dinnerbone", "Djinnibone", "Steve"]) + self.assertEqual(response.software.brand, "vanilla") + self.assertEqual(response.software.version, "1.8") + self.assertEqual(response.software.plugins, []) + + +class TestQueryResponsePlayers(TestCase): + def test_valid(self): + players = QueryResponse.Players(5, 20, ["Dinnerbone", "Djinnibone", "Steve"]) + + self.assertEqual(players.online, 5) + self.assertEqual(players.max, 20) + self.assertEqual(players.names, ["Dinnerbone", "Djinnibone", "Steve"]) + + +class TestQueryResponseSoftware(TestCase): + def test_vanilla(self): + software = QueryResponse.Software("1.8", "") + + self.assertEqual(software.brand, "vanilla") + self.assertEqual(software.version, "1.8") + self.assertEqual(software.plugins, []) + + def test_modded(self): + software = QueryResponse.Software("1.8", "A modded server: Foo 1.0; Bar 2.0; Baz 3.0") + + self.assertEqual(software.brand, "A modded server") + self.assertEqual(software.plugins, ["Foo 1.0", "Bar 2.0", "Baz 3.0"]) + + def test_modded_no_plugins(self): + software = QueryResponse.Software("1.8", "A modded server") + + self.assertEqual(software.brand, "A modded server") + self.assertEqual(software.plugins, []) \ No newline at end of file