Skip to content

Commit 51a6665

Browse files
authored
feat: port serverlist into Central Command (#102)
* fix: run pre-commit checks from inside uv venv * feat: ported current serverlist logic to cc * feat: include rate limiting to avoid being taken down by funny users * chore: baby serverlist migrations * feat: add API tests for BabyServer and update permissions for ListBabyServersView * feat: improved test coverage
1 parent a231418 commit 51a6665

28 files changed

+684
-11
lines changed

.github/workflows/main.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ jobs:
6868
cd src
6969
uv run manage.py makemigrations --check
7070
uv run manage.py migrate
71-
uv run manage.py test tests/
71+
uv run manage.py test
7272
7373
docker:
7474
needs: [ lint, unit_test ]

.pre-commit-config.yaml

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,22 +13,20 @@ repos:
1313
args: ["--allow-multiple-documents"]
1414
- id: debug-statements
1515
- id: trailing-whitespace
16-
exclude: >-
17-
^.*.md$
16+
exclude: ^.*.md$
1817

1918
- repo: https://github.com/astral-sh/ruff-pre-commit
2019
rev: v0.7.0
2120
hooks:
2221
- id: ruff
23-
args: [ --fix ]
22+
args: [--fix]
2423
- id: ruff-format
2524

26-
# local mypy because of stub dependencies
2725
- repo: local
2826
hooks:
2927
- id: typecheck
30-
name: Typecheck
31-
entry: mypy .
32-
types: [python]
28+
name: Typecheck (uv)
29+
entry: uv run mypy
3330
language: system
3431
pass_filenames: false
32+
args: ["."]

dev-compose.yml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,15 @@ services:
1010
ports:
1111
- "5432:5432"
1212

13+
cache:
14+
image: memcached:latest
15+
ports:
16+
- "11211:11211"
17+
1318
web:
1419
depends_on:
15-
- db
20+
- db
21+
- cache
1622
build: .
1723
env_file: ./.env
1824
ports:

docker-compose.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,13 @@ services:
88
volumes:
99
- db-data:/var/lib/postgresql/data
1010

11+
cache:
12+
image: memcached:latest
13+
1114
web:
15+
depends_on:
16+
- db
17+
- cache
1218
image: unitystation/central-command:latest
1319
environment:
1420
- DEBUG=0

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ dependencies = [
1313
"psycopg2-binary~=2.9.9",
1414
"python-dotenv~=0.19.2",
1515
"whitenoise~=6.6.0",
16+
"pymemcache>=4.0,<5.0",
1617
]
1718

1819
[build-system]

src/accounts/api/serializers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ def validate(self, data):
9393

9494
if not account_confirmation.is_token_valid():
9595
raise serializers.ValidationError({"token": "Token is invalid or expired."})
96-
return {"token": data["token"]}
96+
return {"token": data["token"], "account_confirmation": account_confirmation}
9797

9898

9999
class EmailSerializer(serializers.Serializer):

src/accounts/api/views.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -324,7 +324,7 @@ def post(self, request):
324324
if not serializer.is_valid():
325325
return ErrorResponse(serializer.errors, status.HTTP_400_BAD_REQUEST)
326326

327-
account_confirmation = AccountConfirmation.objects.get(token=serializer.validated_data["token"])
327+
account_confirmation: AccountConfirmation = serializer.validated_data["account_confirmation"]
328328
account = account_confirmation.account
329329

330330
account.is_confirmed = True

src/baby_serverlist/__init__.py

Whitespace-only changes.

src/baby_serverlist/admin.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
from django.contrib import admin
2+
3+
from .models import BabyServer
4+
5+
6+
@admin.register(BabyServer)
7+
class BabyServerAdmin(admin.ModelAdmin):
8+
list_display = ("id", "owner", "whitelisted", "serverlist_token")
9+
search_fields = ("id", "owner__email", "owner__unique_identifier")
10+
list_filter = ("whitelisted",)
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
from rest_framework import serializers
2+
3+
4+
class ServerStatusSerializer(serializers.Serializer):
5+
ServerToken = serializers.CharField()
6+
Passworded = serializers.BooleanField()
7+
ServerName = serializers.CharField()
8+
ForkName = serializers.CharField()
9+
BuildVersion = serializers.IntegerField()
10+
CurrentMap = serializers.CharField()
11+
GameMode = serializers.CharField()
12+
IngameTime = serializers.CharField()
13+
RoundTime = serializers.CharField()
14+
PlayerCount = serializers.IntegerField()
15+
PlayerCountMax = serializers.IntegerField()
16+
ServerIP = serializers.CharField()
17+
ServerPort = serializers.IntegerField()
18+
WinDownload = serializers.CharField()
19+
OSXDownload = serializers.CharField()
20+
LinuxDownload = serializers.CharField()
21+
fps = serializers.IntegerField()
22+
GoodFileVersion = serializers.CharField()
23+
24+
25+
class ActiveServersSerializer(serializers.Serializer):
26+
CashDateTime = serializers.DateTimeField()
27+
servers = ServerStatusSerializer(many=True)
28+
29+
30+
class RegenerateServerlistTokenSerializer(serializers.Serializer):
31+
server_id = serializers.UUIDField()

0 commit comments

Comments
 (0)