diff --git a/src/gameservers/management/commands/update_server_stats.py b/src/gameservers/management/commands/update_server_stats.py index dd3d70b..038bf65 100755 --- a/src/gameservers/management/commands/update_server_stats.py +++ b/src/gameservers/management/commands/update_server_stats.py @@ -3,6 +3,7 @@ import re from django.core.management.base import BaseCommand +from django.utils import timezone from gameservers.models import Server, ServerHistory @@ -88,12 +89,23 @@ class ServerParser(object): class Command(BaseCommand): help = 'Update history stats for all ss13 servers.' + def _update_stats(self, server, players, time): + # Create a new record in the history + history = ServerHistory(server=server, players=players) + + # Update "live stats" + server.update_stats(players, time=time) + server.save() + + return history + def handle(self, *args, **kwargs): parser = ServerParser() #parser.url = './dump.html' # Use a local file instead when testing servers = parser.run() servers_handled = [] new_items = [] + now = timezone.now() for data in servers: # Prevent empty servers with identical names to other, active servers @@ -112,13 +124,13 @@ class Command(BaseCommand): ) ) - # Create a new record in the history - history = ServerHistory(server=server, players=data['player_count']) - new_items.append(history) + tmp = self._update_stats(server, data['player_count'], now) + new_items.append(tmp) - # Update "live stats" - server.update_stats(data['player_count']) - server.save() + # Make sure to update servers not available on the page. + for server in Server.objects.exclude(last_updated__exact=now): + tmp = self._update_stats(server, 0, None) + new_items.append(tmp) ServerHistory.objects.bulk_create(new_items) Server.remove_old_servers() diff --git a/src/gameservers/migrations/0013_auto_20150310_1944.py b/src/gameservers/migrations/0013_auto_20150310_1944.py new file mode 100644 index 0000000..3e9d200 --- /dev/null +++ b/src/gameservers/migrations/0013_auto_20150310_1944.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('gameservers', '0012_auto_20150309_1442'), + ] + + operations = [ + migrations.AlterField( + model_name='server', + name='last_updated', + field=models.DateTimeField(default=django.utils.timezone.now, editable=False), + preserve_default=True, + ), + ] diff --git a/src/gameservers/models.py b/src/gameservers/models.py index 15b8bd8..7d734b6 100644 --- a/src/gameservers/models.py +++ b/src/gameservers/models.py @@ -22,7 +22,7 @@ class Server(models.Model): game_url = models.CharField(max_length=255) site_url = models.URLField(blank=True) - last_updated = models.DateTimeField(auto_now=True, default=timezone.now) + last_updated = models.DateTimeField(default=timezone.now, editable=False) players_current = models.PositiveIntegerField(default=0, editable=False) players_avg = models.PositiveIntegerField(default=0, editable=False) players_min = models.PositiveIntegerField(default=0, editable=False) @@ -80,7 +80,11 @@ class Server(models.Model): weekdays.insert(len(weekdays), weekdays.pop(0)) return weekdays - def update_stats(self, player_count=0): + def update_stats(self, player_count=0, time=None): + # TODO: default to setting current time + if time: + self.last_updated = time + self.players_current = player_count tmp = self.measure_players(days=31)