From 2630afa14dc22e61c42f93aae3b64044e4552c2d Mon Sep 17 00:00:00 2001 From: "A. Svensson" Date: Sun, 8 Mar 2015 11:31:26 +0100 Subject: [PATCH] Did some changes on how to get the player history for a server. --- src/gameservers/models.py | 28 ++++++++++---------- src/gameservers/views.py | 10 +++---- src/templates/gameservers/server_detail.html | 2 +- 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/gameservers/models.py b/src/gameservers/models.py index 7c522c4..1f270ca 100644 --- a/src/gameservers/models.py +++ b/src/gameservers/models.py @@ -1,6 +1,4 @@ -import datetime - from django.db import models from django.utils import timezone @@ -34,8 +32,8 @@ class PlayerHistory(object): def __init__(self, redis_settings=dict(host='localhost', port=6379, db=0)): self.redis = redis.StrictRedis(**redis_settings) - # 2688 = 4 times per hour * 24 hours * 7 days * 4 weeks - self.max_points = 2688 + # 32256 = 4 times per hour * 24 hours * 7 days * 4 weeks * 12 months + self.max_items = 32256 def add_point(self, server, time, players): '''Add a new point in the player history.''' @@ -43,17 +41,19 @@ class PlayerHistory(object): def trim_points(self, server): '''Trim away too old points and servers in the player history.''' - self.redis.ltrim(server, 0, self.max_points) + self.redis.ltrim(server, 0, self.max_items) # let the list expire after a week without updates self.redis.expire(server, 604800) - def get_points(self, server): - '''Get a range of points from the player history.''' - # TODO: not memory efficient, turn into a generator instead? - points = [] - for tmp in self.redis.lrange(server, 0, self.max_points): - time, players = tmp.split(',') - time, players = datetime.datetime.fromtimestamp(float(time)), int(players) - points.append((time, players)) - return points + def get_history(self, server, days=7): + '''Get a range of days in a server's player history.''' + # 96 = 4 times per hour * 24 hours + max_items = days * 96 + + items = [] + for tmp in self.redis.lrange(server, 0, max_items): + time, players = tmp.split(',') + time, players = float(time), int(players) + items.append((time, players)) + return items diff --git a/src/gameservers/views.py b/src/gameservers/views.py index 8eb9c76..d42bc66 100644 --- a/src/gameservers/views.py +++ b/src/gameservers/views.py @@ -14,22 +14,22 @@ class ServerDetailView(generic.DetailView): context = super(ServerDetailView, self).get_context_data(**kwargs) server = context['server'] history = PlayerHistory() - points = history.get_points(server) - context['player_history'] = points + items = history.get_history(server) + context['player_history'] = items # Moving average for the last day # TODO: remove the hardcoded value - tmp = [players for time, players in points[-96:]] + tmp = [players for time, players in items[-96:]] context['daily_average'] = sum(tmp) / float(len(tmp)) context['daily_min'] = min(tmp) context['daily_max'] = max(tmp) - tmp = [players for time, players in points[-96*7:]] + tmp = [players for time, players in items[-96*7:]] context['weekly_average'] = sum(tmp) / float(len(tmp)) context['weekly_min'] = min(tmp) context['weekly_max'] = max(tmp) - tmp = [players for time, players in points] + tmp = [players for time, players in items] context['total_average'] = sum(tmp) / float(len(tmp)) context['total_min'] = min(tmp) context['total_max'] = max(tmp) diff --git a/src/templates/gameservers/server_detail.html b/src/templates/gameservers/server_detail.html index e4feb95..500d732 100644 --- a/src/templates/gameservers/server_detail.html +++ b/src/templates/gameservers/server_detail.html @@ -63,7 +63,7 @@ var series = [ {# convert timestamp to ms, because javascript... #} {% for timestamp, players in player_history %} - [{{timestamp|date:'U'}} * 1000, {{players}}], + [{{timestamp}} * 1000, {{players}}], {% endfor %} ];