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",
|
"room_name": "Pond Friends",
|
||||||
"port": 7777,
|
"port": 7777,
|
||||||
"current_players": 1,
|
"current_players": 0,
|
||||||
"max_players": 8,
|
"max_players": 8,
|
||||||
"game_version": "0.6.4-alpha",
|
"game_version": "0.6.4-alpha",
|
||||||
"protocol_version": 3
|
"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
|
The `201` response includes the public `room` and a secret `lease_token`. The host retains that
|
||||||
token only for the current hosting session.
|
token only for the current hosting session.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,3 @@
|
||||||
"""NETfishing discovery service."""
|
"""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)
|
room_name = _clean_text(payload.get("room_name"), "room_name", ROOM_NAME_MAX_LENGTH)
|
||||||
port = _clean_int(payload.get("port"), "port", 1, 65_535)
|
port = _clean_int(payload.get("port"), "port", 1, 65_535)
|
||||||
current_players = _clean_int(
|
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(
|
max_players = _clean_int(
|
||||||
payload.get("max_players"), "max_players", 1, MAX_ROOM_CAPACITY
|
payload.get("max_players"), "max_players", 1, MAX_ROOM_CAPACITY
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
||||||
|
|
||||||
[project]
|
[project]
|
||||||
name = "netfishing-discovery-server"
|
name = "netfishing-discovery-server"
|
||||||
version = "0.1.0"
|
version = "0.1.1"
|
||||||
description = "Ephemeral public-room directory for NETfishing"
|
description = "Ephemeral public-room directory for NETfishing"
|
||||||
requires-python = ">=3.11"
|
requires-python = ">=3.11"
|
||||||
dependencies = []
|
dependencies = []
|
||||||
|
|
|
||||||
|
|
@ -92,6 +92,21 @@ class DiscoveryHTTPTests(unittest.TestCase):
|
||||||
assert body is not None
|
assert body is not None
|
||||||
self.assertEqual(body["error"]["code"], "invalid_room")
|
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:
|
def test_health_endpoint(self) -> None:
|
||||||
status, body = self.request("GET", "/health")
|
status, body = self.request("GET", "/health")
|
||||||
self.assertEqual(status, 200)
|
self.assertEqual(status, 200)
|
||||||
|
|
|
||||||
|
|
@ -49,6 +49,12 @@ class RoomRegistryTests(unittest.TestCase):
|
||||||
self.registry.delete(room.room_id, token)
|
self.registry.delete(room.room_id, token)
|
||||||
self.assertEqual(self.registry.list_rooms(), [])
|
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:
|
def test_expired_room_is_removed(self) -> None:
|
||||||
room, token = self.registry.create("203.0.113.10", VALID_ROOM)
|
room, token = self.registry.create("203.0.113.10", VALID_ROOM)
|
||||||
self.clock.now += 30.0
|
self.clock.now += 30.0
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue