Skip to content

Commit feed727

Browse files
committed
feat: wip definition of models for new server management
1 parent 3509ace commit feed727

File tree

7 files changed

+69
-93
lines changed

7 files changed

+69
-93
lines changed

dev-compose.yml

+3-7
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,10 @@ services:
1010
ports:
1111
- "5432:5432"
1212

13-
redis:
14-
image: redis:7.2.5-alpine
13+
memcached:
14+
image: memcached:1.6-alpine
1515
ports:
16-
- "6379:6379"
17-
environment:
18-
REDIS_PORT: 6379
16+
- "11211:11211"
1917

2018
web:
2119
depends_on:
@@ -30,5 +28,3 @@ services:
3028

3129
volumes:
3230
db-data:
33-
static-volume:
34-
media-volume:

docker-compose.yml

+2-4
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,8 @@ services:
88
volumes:
99
- db-data:/var/lib/postgresql/data
1010

11-
redis:
12-
image: redis:7.2.5-alpine
13-
environment:
14-
REDIS_PORT: 6379
11+
memcached:
12+
image: memcached:1.6-alpine
1513

1614
web:
1715
image: unitystation/central-command:latest

example.env

+2-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ DB_ENGINE=django.db.backends.postgresql
1313
DB_NAME=postgres
1414
DB_HOST=db
1515
DB_PORT=5432
16-
REDIS_HOST=redis
16+
MEMCACHED_LOCATION=127.0.0.1
17+
MEMCACHED_PORT=11211
1718

1819
# Links to stuff
1920
WEBSITE_URL = http://localhost:8000

poetry.lock

+12-48
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ python-dotenv = "^0.19.2"
101101
whitenoise = "^6.2.0"
102102
django-post-office = "^3.8.0"
103103
drf-spectacular = "^0.27.1"
104-
django-redis = "^5.4.0"
104+
pymemcache = "^4.0.0"
105105

106106
[tool.poetry.group.lint.dependencies]
107107
pre-commit = "3.*"

src/central_command/settings.py

+4-6
Original file line numberDiff line numberDiff line change
@@ -103,15 +103,13 @@
103103
}
104104
}
105105

106-
REDIS_LOCATION = f"redis://{os.environ.get('REDIS_HOST')}:6379/1"
106+
MEMCACHED_HOST = os.environ.get("MEMCACHED_HOST", "127.0.0.1")
107+
MEMCACHED_PORT = os.environ.get("MEMCACHED_PORT", 11211)
107108

108109
CACHES = {
109110
"default": {
110-
"BACKEND": "django_redis.cache.RedisCache",
111-
"LOCATION": REDIS_LOCATION,
112-
"OPTIONS": {
113-
"CLIENT_CLASS": "django_redis.client.DefaultClient",
114-
},
111+
"BACKEND": "django.core.cache.backends.memcached.PyMemcacheCache",
112+
"LOCATION": f"{MEMCACHED_HOST}:{MEMCACHED_PORT}",
115113
}
116114
}
117115

src/server/models.py

+45-26
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import secrets
2-
import string
32

43
from django.db import models
54
from django.db.models.signals import pre_save
@@ -9,30 +8,34 @@
98

109

1110
class CodeScanInformation(models.Model):
11+
"""Information regarding the CodeScan that will be used to scan the code for this build after downloading on clients"""
12+
1213
version = models.TextField(primary_key=True)
1314

1415
def __str__(self):
1516
return self.version
1617

1718

1819
def generate_listing_key():
19-
alphabet = string.ascii_letters + string.digits + "-_"
20-
return "".join(secrets.choice(alphabet) for _ in range(30))
20+
# 22 bytes produce 30 characters
21+
return secrets.token_urlsafe(22)
2122

2223

2324
class ServerInformation(models.Model):
25+
"""Basic information that describes and identifies a server"""
26+
2427
owner = models.ForeignKey(
2528
verbose_name="Owner",
2629
to=Account,
2730
on_delete=models.CASCADE,
2831
help_text="Who created and/or is responsible for this server",
2932
)
30-
name = models.TextField(
33+
name = models.CharField(
3134
verbose_name="Name",
3235
max_length=50,
3336
help_text="Name this server uses to present itself in the servers list",
3437
)
35-
description = models.TextField(
38+
description = models.CharField(
3639
verbose_name="Description",
3740
max_length=200,
3841
help_text="A brief description of what this server is about",
@@ -47,9 +50,10 @@ class ServerInformation(models.Model):
4750
blank=True,
4851
help_text="The rules that players must follow on this server",
4952
)
50-
motd = models.TextField(
53+
motd = models.CharField(
5154
verbose_name="Message of the Day (MOTD)",
5255
help_text="Message displayed to players when they join the server",
56+
max_length=255,
5357
)
5458
is_18_plus = models.BooleanField(
5559
verbose_name="18+",
@@ -66,18 +70,20 @@ class ServerInformation(models.Model):
6670
verbose_name="Is Delisted",
6771
help_text="Indicates if this server is delisted from the servers list",
6872
)
69-
listing_key = models.TextField(
73+
listing_key = models.CharField(
7074
unique=True,
7175
verbose_name="Listing Key",
7276
null=True,
7377
blank=True,
78+
max_length=30,
7479
help_text="A unique key used for listing this server. Do not lose this key!",
7580
)
7681

7782
def __str__(self):
7883
return f"Server: {self.name} by: {self.owner.unique_identifier}"
7984

8085

86+
# Binds the save event of ServerInformation model to this function so that the key is generated every time a new ServerInformation is created
8187
@receiver(pre_save, sender=ServerInformation)
8288
def set_listing_key(sender, instance: ServerInformation, **kwargs):
8389
if not instance.listing_key:
@@ -89,28 +95,39 @@ def set_listing_key(sender, instance: ServerInformation, **kwargs):
8995
unique_key_found = True
9096

9197

92-
# class ServerStatus(models.Model):
93-
# server = models.ForeignKey(
94-
# ServerInformation, related_name="status", on_delete=models.CASCADE
95-
# )
96-
# is_passworded = models.BooleanField()
97-
# fork_name = models.TextField()
98-
# build_version = models.TextField()
99-
# current_map = models.TextField()
100-
# game_mode = models.TextField()
101-
# ingame_time = models.TextField()
102-
# round_time = models.TextField()
103-
# player_count = models.PositiveSmallIntegerField()
104-
# player_count_max = models.PositiveSmallIntegerField()
105-
# ip = models.TextField()
106-
# port = models.PositiveSmallIntegerField()
107-
# windows_download = models.URLField()
108-
# osx_download = models.URLField()
109-
# linux_download = models.URLField()
110-
# fps = models.PositiveSmallIntegerField()
98+
class ServerTag(models.Model):
99+
"""Represents an individual tag a server could have attached to it to make them easier to find by categories"""
100+
101+
server = models.ForeignKey(to=ServerInformation, related_name="tags", on_delete=models.CASCADE)
102+
name = models.TextField(verbose_name="Name", max_length=50)
103+
104+
# class ServerStatus(models.Model):
105+
# server = models.ForeignKey(
106+
# ServerInformation, related_name="status", on_delete=models.CASCADE
107+
# )
108+
# is_passworded = models.BooleanField()
109+
# fork_name = models.TextField()
110+
# build_version = models.TextField()
111+
# current_map = models.TextField()
112+
# game_mode = models.TextField()
113+
# ingame_time = models.TextField()
114+
# round_time = models.TextField()
115+
# player_count = models.PositiveSmallIntegerField()
116+
# player_count_max = models.PositiveSmallIntegerField()
117+
# ip = models.TextField()
118+
# port = models.PositiveSmallIntegerField()
119+
# windows_download = models.URLField()
120+
# osx_download = models.URLField()
121+
# linux_download = models.URLField()
122+
# fps = models.PositiveSmallIntegerField()
123+
124+
def __str__(self) -> str:
125+
return self.name
111126

112127

113128
class AccountModerationInfo(models.Model):
129+
"""Information an account has permanently attached to it for the purpose of moderating their behaviour on the hub"""
130+
114131
account = models.OneToOneField(to=Account, related_name="moderation_info", on_delete=models.CASCADE)
115132
can_create_servers = models.BooleanField(default=True)
116133
can_list_servers = models.BooleanField(default=True)
@@ -120,6 +137,8 @@ def __str__(self):
120137

121138

122139
class ServerAdmonition(models.Model):
140+
"""Represents a warning or reprimand an account received for their misbehaviour or mismanagement of their server"""
141+
123142
SEVERITY_LEVELS = [
124143
("low", "Low"),
125144
("medium", "Medium"),

0 commit comments

Comments
 (0)