From 6a7c7a676d168ef5393c4e3168bb86a3c9a0499f Mon Sep 17 00:00:00 2001 From: Voyager Date: Mon, 10 Aug 2026 13:56:03 -0400 Subject: [PATCH] Support empty dedicated room listings --- docs/API.md | 5 ++++- netfishing_discovery/__init__.py | 2 +- netfishing_discovery/registry.py | 2 +- pyproject.toml | 2 +- tests/test_http_api.py | 15 +++++++++++++++ tests/test_registry.py | 6 ++++++ 6 files changed, 28 insertions(+), 4 deletions(-) diff --git a/docs/API.md b/docs/API.md index 3dd2255..43c8b0d 100644 --- a/docs/API.md +++ b/docs/API.md @@ -27,13 +27,16 @@ trusting an address supplied by the game client. { "room_name": "Pond Friends", "port": 7777, - "current_players": 1, + "current_players": 0, "max_players": 8, "game_version": "0.6.4-alpha", "protocol_version": 3 } ``` +`current_players` may be zero for an empty dedicated server. A player-hosted +room normally includes its host in this count. + The `201` response includes the public `room` and a secret `lease_token`. The host retains that token only for the current hosting session. diff --git a/netfishing_discovery/__init__.py b/netfishing_discovery/__init__.py index fb1da0b..f1dc111 100644 --- a/netfishing_discovery/__init__.py +++ b/netfishing_discovery/__init__.py @@ -1,3 +1,3 @@ """NETfishing discovery service.""" -__version__ = "0.1.0" +__version__ = "0.1.1" diff --git a/netfishing_discovery/registry.py b/netfishing_discovery/registry.py index cec54dd..31a1737 100644 --- a/netfishing_discovery/registry.py +++ b/netfishing_discovery/registry.py @@ -208,7 +208,7 @@ class RoomRegistry: room_name = _clean_text(payload.get("room_name"), "room_name", ROOM_NAME_MAX_LENGTH) port = _clean_int(payload.get("port"), "port", 1, 65_535) current_players = _clean_int( - payload.get("current_players"), "current_players", 1, MAX_ROOM_CAPACITY + payload.get("current_players"), "current_players", 0, MAX_ROOM_CAPACITY ) max_players = _clean_int( payload.get("max_players"), "max_players", 1, MAX_ROOM_CAPACITY diff --git a/pyproject.toml b/pyproject.toml index 1261e4c..edbd0a0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "netfishing-discovery-server" -version = "0.1.0" +version = "0.1.1" description = "Ephemeral public-room directory for NETfishing" requires-python = ">=3.11" dependencies = [] diff --git a/tests/test_http_api.py b/tests/test_http_api.py index 85706f0..d62d301 100644 --- a/tests/test_http_api.py +++ b/tests/test_http_api.py @@ -92,6 +92,21 @@ class DiscoveryHTTPTests(unittest.TestCase): assert body is not None self.assertEqual(body["error"]["code"], "invalid_room") + def test_empty_dedicated_room_can_be_listed(self) -> None: + status, created = self.request( + "POST", "/v1/rooms", dict(VALID_ROOM, current_players=0) + ) + self.assertEqual(status, 201) + assert created is not None + room = created["room"] + assert isinstance(room, dict) + self.assertEqual(room["current_players"], 0) + self.request( + "DELETE", + f"/v1/rooms/{room['room_id']}", + token=str(created["lease_token"]), + ) + def test_health_endpoint(self) -> None: status, body = self.request("GET", "/health") self.assertEqual(status, 200) diff --git a/tests/test_registry.py b/tests/test_registry.py index f3558ba..ece70f4 100644 --- a/tests/test_registry.py +++ b/tests/test_registry.py @@ -49,6 +49,12 @@ class RoomRegistryTests(unittest.TestCase): self.registry.delete(room.room_id, token) self.assertEqual(self.registry.list_rooms(), []) + def test_empty_dedicated_room_is_valid(self) -> None: + room, _token = self.registry.create( + "203.0.113.10", dict(VALID_ROOM, current_players=0) + ) + self.assertEqual(room.current_players, 0) + def test_expired_room_is_removed(self) -> None: room, token = self.registry.create("203.0.113.10", VALID_ROOM) self.clock.now += 30.0