Support empty dedicated room listings

This commit is contained in:
Alexander Sellite 2026-08-10 13:56:03 -04:00
parent b5b3cc0211
commit 6a7c7a676d
6 changed files with 28 additions and 4 deletions

View file

@ -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.

View file

@ -1,3 +1,3 @@
"""NETfishing discovery service."""
__version__ = "0.1.0"
__version__ = "0.1.1"

View file

@ -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

View file

@ -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 = []

View file

@ -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)

View file

@ -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