from django.shortcuts import render, HttpResponse from django.http import HttpResponseBadRequest from django.views.generic import TemplateView from django.utils.decorators import method_decorator from django.views.decorators.csrf import csrf_exempt from bloonsa_game.models import Level, LevelRating, LevelScore from users.models import Player from users.util import bloonsa_util, actions class CSRFexemptTemplateView(TemplateView): @method_decorator(csrf_exempt) def dispatch(self, *args, **kwargs): return super().dispatch(*args, **kwargs) class LoadLevel(CSRFexemptTemplateView): def post(self, request, *args, **kwargs): level_id = request.POST.get("level_id") if level_id is None or not level_id.isdigit(): return HttpResponseBadRequest() level = Level.objects.filter(levelId=int(level_id)).first() if level is None: return HttpResponseBadRequest() if request.user.is_authenticated: bloonsa_util.tag_player(request=request) player = Player.objects.get(user=request.user) player.bloonsa_levelsPlayed.add(level) bloonsa_util.log(player=player, action=actions.bloonsa_load_level_by_id, note=level.levelId) flashVars = level.getFlashVars(seperator="&") return HttpResponse(flashVars) class RandomLevel(CSRFexemptTemplateView): def post(self, request, *args, **kwargs): level = Level.objects.order_by("?").first() flashVars = level.getFlashVars(seperator="&") if request.user.is_authenticated: bloonsa_util.tag_player(request=request) player = Player.objects.get(user=request.user) player.bloonsa_levelsPlayed.add(level) bloonsa_util.log(player=player, action=actions.bloonsa_load_random_level, note=level.levelId) return HttpResponse(flashVars) def get(self, request, *args, **kwargs): return self.post(request=request, *args, **kwargs) class CompleteLevel(CSRFexemptTemplateView): def post(self, request, *args, **kwargs): if request.user.is_authenticated: bloonsa_util.tag_player(request=request) level_id = int(request.POST.get("level_id")) darts_left = int(request.POST.get("darts_left")) pops = int(request.POST.get("pops")) level = Level.objects.get(levelId=level_id) player = Player.objects.get(user=request.user) prevScore = player.bloonsa_level_scores.first() if prevScore is None \ or pops > prevScore.pops \ or pops == prevScore.pops and darts_left > prevScore.darts_left: score = LevelScore.objects.create(level=level, clear=True, darts_left=darts_left, pops=pops) if prevScore: player.bloonsa_level_scores.remove(prevScore) player.bloonsa_level_scores.add(score) score.save() player.save() bloonsa_util.log(player=player, action=actions.bloonsa_submit_score, note=level.levelId) # Sending empty content means error in as3 return HttpResponse(content="GG", status=200) class RateLevel(CSRFexemptTemplateView): def post(self, request, *args, **kwargs): if request.user.is_authenticated: bloonsa_util.tag_player(request=request) rating = int(request.POST.get("rating")) level_id = int(request.POST.get("level_id")) level = Level.objects.get(levelId=level_id) player = Player.objects.get(user=request.user) ratingObject = Player.objects.filter(bloonsa_levelRatings__level=level).first() if ratingObject: ratingObject.rating = rating ratingObject.save() else: rating = LevelRating.objects.create(level=level, rating=rating) player.bloonsa_levelRatings.add(rating) rating.save() player.save() bloonsa_util.log(player=player, action=actions.bloonsa_rate_level, note=level.levelId) return HttpResponse(content="OK", status=200) return HttpResponse(status=400)