Support empty dedicated room listings
This commit is contained in:
parent
b5b3cc0211
commit
6a7c7a676d
6 changed files with 28 additions and 4 deletions
|
|
@ -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.
|
||||
|
||||
|
|
|
|||
|
|
@ -1,3 +1,3 @@
|
|||
"""NETfishing discovery service."""
|
||||
|
||||
__version__ = "0.1.0"
|
||||
__version__ = "0.1.1"
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 = []
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue