Add API to log player sessions. Fixes #2

This commit is contained in:
Trever Fischer
2012-03-07 19:00:50 -05:00
parent e73d007a19
commit 9ca328dd75
5 changed files with 153 additions and 3 deletions

View File

@@ -2,10 +2,11 @@ from piston.handler import AnonymousBaseHandler, BaseHandler
from django.core.cache import cache
from minecraft.models import MinecraftProfile
from local.models import Quote
from minecraft.models import MOTD, Server
from minecraft.models import MOTD, Server, PlayerSession
from django.http import HttpResponse
from urllib2 import urlopen
import json
from datetime import datetime
class WhitelistHandler(AnonymousBaseHandler):
allowed_methods = ('GET',)
@@ -55,3 +56,22 @@ class ServerHandler(AnonymousBaseHandler):
except Exception, e:
serverTime = -1
return {"hostname":hostname, "port":s.port, "players": playerList, "time":serverTime, "rules": s.ruleset.split('\n')}
class PlayerSessionHandler(BaseHandler):
allowed_methods = ('POST', 'PUT')
model = PlayerSession
def create(self, request):
hostname = request.POST['hostname']
playername = request.POST['player']
ip = request.POST['ip']
server = Server.objects.get(hostname__exact=hostname)
profile = MinecraftProfile.objects.get(mc_username__exact=playername)
session = PlayerSession.objects.create(server=server, player=profile, ip=ip)
return {'session':session.id}
def update(self, request):
session = PlayerSession.objects.get(id__exact=request.POST['session'])
session.end = datetime.now()
session.save()

View File

@@ -2,7 +2,7 @@ from django.utils import unittest
import json
from django.test.client import Client
from django.contrib.auth.models import User
from minecraft.models import MinecraftProfile
from minecraft.models import MinecraftProfile, Server, PlayerSession
class MOTDTest(unittest.TestCase):
def setUp(self):
@@ -54,3 +54,28 @@ class WhitelistTest(unittest.TestCase):
response = json.loads(self.client.get('/api/validate/InvalidUser').content)
self.assertEqual(response['valid'], False)
class SessionTest(unittest.TestCase):
def setUp(self):
self.client = Client()
self.user = User.objects.create_user('ValidUsername', 'test@example.com')
self.user.minecraftprofile.mc_username = "ValidUsername"
self.user.minecraftprofile.save()
self.server = Server.objects.create(hostname='localhost')
def tearDown(self):
self.user.delete()
self.server.delete()
def testSessionStart(self):
resp = self.client.post('/api/session', {'hostname':self.server.hostname, 'player':self.user.minecraftprofile.mc_username, 'ip': '127.0.0.1'})
self.assertEqual(resp.status_code, 200)
session = json.loads(resp.content)
sessionObj = PlayerSession.objects.get(id__exact=session['session'])
def testSessionEnd(self):
resp = self.client.post('/api/session', {'hostname':self.server.hostname, 'player':self.user.minecraftprofile.mc_username, 'ip': '127.0.0.1'})
session = json.loads(resp.content)
resp = self.client.put('/api/session', {'session':session['session']})
self.assertEqual(resp.status_code, 200)
sessionObj = PlayerSession.objects.get(id__exact=session['session'])
self.assertNotEqual(sessionObj.end, None)

View File

@@ -9,5 +9,6 @@ urlpatterns = patterns('api',
url(r'^validate/(?P<username>.*)$', whitelistHandler),
url(r'^motd/(?P<username>.*)$', motdHandler),
url(r'^balance$', Resource(handlers.BalanceHandler)),
url(r'^server/(?P<hostname>.*)$', Resource(handlers.ServerHandler))
url(r'^server/(?P<hostname>.*)$', Resource(handlers.ServerHandler)),
url(r'^session$', Resource(handlers.PlayerSessionHandler)),
)

View File

@@ -0,0 +1,97 @@
# encoding: utf-8
import datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models
class Migration(SchemaMigration):
def forwards(self, orm):
# Adding model 'PlayerSession'
db.create_table('minecraft_playersession', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('server', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['minecraft.Server'])),
('player', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['minecraft.MinecraftProfile'])),
('ip', self.gf('django.db.models.fields.IPAddressField')(max_length=15)),
('start', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
('end', self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True)),
))
db.send_create_signal('minecraft', ['PlayerSession'])
def backwards(self, orm):
# Deleting model 'PlayerSession'
db.delete_table('minecraft_playersession')
models = {
'auth.group': {
'Meta': {'object_name': 'Group'},
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
},
'auth.permission': {
'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
},
'auth.user': {
'Meta': {'object_name': 'User'},
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
},
'contenttypes.contenttype': {
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
'minecraft.minecraftprofile': {
'Meta': {'object_name': 'MinecraftProfile'},
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'mc_username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}),
'user': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['auth.User']", 'unique': 'True'})
},
'minecraft.motd': {
'Meta': {'object_name': 'MOTD'},
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'server': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['minecraft.Server']"}),
'text': ('django.db.models.fields.TextField', [], {})
},
'minecraft.playersession': {
'Meta': {'object_name': 'PlayerSession'},
'end': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'ip': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
'player': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['minecraft.MinecraftProfile']"}),
'server': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['minecraft.Server']"}),
'start': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'})
},
'minecraft.server': {
'Meta': {'object_name': 'Server'},
'hostname': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'port': ('django.db.models.fields.IntegerField', [], {'default': '25565'}),
'query_port': ('django.db.models.fields.IntegerField', [], {'default': '25565'}),
'ruleset': ('django.db.models.fields.TextField', [], {'default': "''"})
}
}
complete_apps = ['minecraft']

View File

@@ -53,6 +53,13 @@ class MOTD(models.Model):
def __unicode__(self):
return self.text
class PlayerSession(models.Model):
server = models.ForeignKey(Server)
player = models.ForeignKey(MinecraftProfile)
ip = models.IPAddressField()
start = models.DateTimeField(auto_now_add=True, blank=False, null=False)
end = models.DateTimeField(blank=True, null=True)
def create_profile(sender, instance, created, **kwargs):
if created:
MinecraftProfile.objects.create(user=instance, mc_username=instance.username)