Did some changes on how to get the player history for a server.
This commit is contained in:
parent
53f3d4e3d5
commit
2630afa14d
@ -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
|
||||
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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 %}
|
||||
];
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user