Files
caminus/api/handlers.py
2012-04-11 15:08:31 -04:00

117 lines
4.7 KiB
Python

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, PlayerSession
from django.db.models import F
from django.http import HttpResponse
from urllib2 import urlopen
import json
from datetime import datetime
class WhitelistHandler(AnonymousBaseHandler):
allowed_methods = ('GET',)
def read(self, request, username):
try:
profile = MinecraftProfile.objects.all().filter(mc_username__iexact=username)[0]
except IndexError, e:
return {'valid': False, 'error': 'User not found', 'permissions': []}
if profile.user.is_active:
if profile.isBanned():
return {'valid': False, 'error': 'Your account is banned.', 'permissions': []}
return {'valid': True, 'error': '', 'permissions': profile.serverPermissions()}
else:
return {'valid': False, 'error': 'Your account is inactive.', 'permissions': []}
class MOTDHandler(AnonymousBaseHandler):
allowed_methods = ('GET',)
def read(self, request, username):
motd = "No MOTD configured!"
motdList = MOTD.objects.all()
if len(motdList) > 0:
motd = motdList[0].text
quote = Quote.objects.order_by('?')
if len(quote) > 0:
motd += "\n"+'"'+quote[0].text+'"'
return {"motd":motd.split('\n')}
class BalanceHandler(BaseHandler):
def read(self, request):
user = request.user
if user.is_anonymous():
return HttpResponse(status=403)
else:
return {"balance":user.minecraftprofile.currencyaccount.balance}
class ServerHandler(AnonymousBaseHandler):
allowed_methods = ('GET',)
def read(self, request, hostname):
s = Server.objects.get(hostname__exact=hostname)
serverTime = cache.get('minecraftServerTime-%s:%s'%(s.hostname, s.port))
playerList = []
if serverTime is None:
try:
dynMapJS = json.load(urlopen("http://%s/map/up/world/world/0"%(hostname)))
serverTime = dynMapJS["servertime"]
playerList = dynMapJS["players"]
cache.set('minecraftServerTime-%s:%s'%(s.hostname, s.port), serverTime, 120)
except Exception, e:
serverTime = -1
return {"hostname":hostname, "port":s.port, "players": playerList, "time":serverTime, "rules": s.ruleset.split('\n')}
class NewPlayerSessionHandler(BaseHandler):
allowed_methods = ('POST',)
def create(self, request, playername):
try:
profile = MinecraftProfile.objects.all().filter(mc_username__iexact=playername)[0]
except IndexError, e:
return {'valid': False, 'error': 'User not found', 'permissions': []}
if profile.user.is_active:
if profile.isBanned():
return {'valid': False, 'error': 'Your account is banned.', 'permissions': []}
ip = request.POST['ip']
server = request.server
profile = MinecraftProfile.objects.get(mc_username__exact=playername)
session = PlayerSession.objects.create(server=server, player=profile, ip=ip)
return {'success': True, 'error': '', 'permissions': profile.serverPermissions(), 'sessionId': session.id}
else:
return {'success': False, 'error': 'Your account is inactive.', 'permissions': []}
class ClosePlayerSessionHandler(BaseHandler):
allowed_methods = ('GET',)
def read(self, request, playername):
sessions = PlayerSession.objects.all().filter(player__mc_username__iexact=playername, end=None)
for session in sessions:
session.end = datetime.now()
session.save()
return {'success': True}
class EconomyHandler(BaseHandler):
allowed_methods = ('PUT','GET')
def read(self, request, playername):
player = MinecraftProfile.objects.get(mc_username__exact=playername)
return {'balance': player.currencyaccount.balance}
def update(self, request, playername):
player = MinecraftProfile.objects.get(mc_username__exact=playername)
delta = request.POST['delta']
newBalance = player.currencyaccount.balance+float(delta)
if newBalance >= 0:
player.currencyaccount.balance = F('balance')+float(delta)
player.currencyaccount.save()
return {'success': True, 'balance': newBalance, 'message': ""}
else:
return {'success': False, 'balance': player.currencyaccount.balance, 'message': "Insufficient balance"}
class ServerPingHandler(BaseHandler):
allowed_methods = ('GET',)
def read(self, request):
return {'identity': request.server}