More progress

This commit is contained in:
Walter 2025-02-07 07:11:18 +01:00
parent 6f7ebb2d47
commit d07c7f73da
8 changed files with 75 additions and 13 deletions

View File

@ -4,12 +4,8 @@ from django.views.generic import TemplateView
from django.utils.decorators import method_decorator from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt from django.views.decorators.csrf import csrf_exempt
import random
import time
# Create your views here.
from bloonsa_game.models import Level from bloonsa_game.models import Level
from users.util import tag_player
class CSRFexemptTemplateView(TemplateView): class CSRFexemptTemplateView(TemplateView):
@ -21,6 +17,7 @@ class CSRFexemptTemplateView(TemplateView):
class LoadLevel(CSRFexemptTemplateView): class LoadLevel(CSRFexemptTemplateView):
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
tag_player(request=request)
levelNum = request.POST.get("level_num") levelNum = request.POST.get("level_num")
if levelNum is None or not levelNum.isdigit(): if levelNum is None or not levelNum.isdigit():
return HttpResponseBadRequest() return HttpResponseBadRequest()
@ -35,19 +32,23 @@ class LoadLevel(CSRFexemptTemplateView):
class RandomLevel(CSRFexemptTemplateView): class RandomLevel(CSRFexemptTemplateView):
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
tag_player(request=request)
level = Level.objects.order_by("?").first() level = Level.objects.order_by("?").first()
flashVars = level.getFlashVars(seperator="&") flashVars = level.getFlashVars(seperator="&")
return HttpResponse(flashVars) return HttpResponse(flashVars)
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
tag_player(request=request)
level = Level.objects.order_by("?").first() level = Level.objects.order_by("?").first()
flashVars = level.getFlashVars(seperator="&") flashVars = level.getFlashVars(seperator="&")
return HttpResponse(flashVars) return HttpResponse(flashVars)
class CompleteLevel(CSRFexemptTemplateView): class CompleteLevel(CSRFexemptTemplateView):
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
tag_player(request=request)
pass pass
class RateLevel(CSRFexemptTemplateView): class RateLevel(CSRFexemptTemplateView):
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
tag_player(request=request)
pass pass

View File

@ -1,7 +1,6 @@
from django.contrib import admin from django.contrib import admin
from .models import Level, Author from .models import Level, Author
# Register your models here.
admin.site.register(Level) admin.site.register(Level)
admin.site.register(Author) admin.site.register(Author)

View File

@ -1,24 +1,26 @@
from django.contrib.auth.forms import AuthenticationForm
from django.shortcuts import render from django.shortcuts import render
from django.views.generic import TemplateView from django.views.generic import TemplateView
# Create your views here.
from bloonsa_game.models import Level from bloonsa_game.models import Level
from users.util import tag_player
class IndexView(TemplateView): class IndexView(TemplateView):
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
tag_player(request=request)
return render(request, "bloonsa_game/index.html", context={}) return render(request, "bloonsa_game/index.html", context={})
class TermsView(TemplateView): class TermsView(TemplateView):
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
tag_player(request=request)
return render(request, "bloonsa_game/terms.html", context={}) return render(request, "bloonsa_game/terms.html", context={})
class GameView(TemplateView): class GameView(TemplateView):
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
tag_player(request=request)
if type(kwargs.get("pk")) is int: if type(kwargs.get("pk")) is int:
level = Level.objects.get(id=kwargs["pk"]) level = Level.objects.get(id=kwargs["pk"])
if level: if level:

View File

@ -1,3 +1,5 @@
from django.contrib import admin from django.contrib import admin
# Register your models here. from .models import Player, User
admin.site.register(Player)

View File

@ -63,3 +63,9 @@ class UserLoginForm(AuthenticationForm):
max_length=16, max_length=16,
label="Username", label="Username",
required=True) required=True)
class Meta:
model = User
fields = [
"username",
]

View File

@ -5,6 +5,8 @@ from django.contrib.auth.models import User
from bloonsa_game.models import Level from bloonsa_game.models import Level
class Player(models.Model): class Player(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True) user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True)
# Savedata # Savedata
@ -21,3 +23,6 @@ class Player(models.Model):
suspended = models.BooleanField(default=False) suspended = models.BooleanField(default=False)
banned = models.BooleanField(default=False) banned = models.BooleanField(default=False)
admin = models.BooleanField(default=False) admin = models.BooleanField(default=False)
def __str__(self):
return f"{self.user} - {self.latestIP}"

40
app/users/util.py Normal file
View File

@ -0,0 +1,40 @@
from django.utils import timezone
from users.models import Player
tracking = False
def get_ip(request):
x_forwarded_for = request.META.get("HTTP_X_FORWARDED_FOR")
if x_forwarded_for:
ip = x_forwarded_for.split(",")[-1].strip()
else:
ip = request.META.get("REMOTE_ADDR")
return ip
# Create a Player object for a User
def init_player(request, user):
if not user.is_authenticated:
return
player = Player.objects.get(user=request.user)
if player:
return
ip = get_ip(request=request)
player = Player(user=user,
creationIP=ip,
latestIP=ip)
player.save()
# Update activity timestamp and IP
def tag_player(request, user=None):
if not tracking:
return
user = user or request.user
if not user.is_authenticated:
return
player = Player.objects.get(user=request.user)
if not player:
init_player(request=request, user=user)
player.latestActivity = timezone.now()
player.latestIP = get_ip(request=request)
player.save()

View File

@ -4,6 +4,8 @@ from django.shortcuts import render, redirect
from django.views.generic import TemplateView from django.views.generic import TemplateView
from users.forms import UserRegisterForm, UserLoginForm from users.forms import UserRegisterForm, UserLoginForm
from users.models import Player
from users.util import init_player, tag_player
class LoginView(TemplateView): class LoginView(TemplateView):
@ -16,7 +18,9 @@ class LoginView(TemplateView):
form = UserLoginForm(data=request.POST) form = UserLoginForm(data=request.POST)
if not form.is_valid(): if not form.is_valid():
return render(request=request, template_name="users/login.html", context={"form": form}) return render(request=request, template_name="users/login.html", context={"form": form})
login(request=request, user=form.get_user()) user = form.get_user()
init_player(request=request, user=user)
login(request=request, user=user)
return redirect("bloonsa_game:game") return redirect("bloonsa_game:game")
@ -30,7 +34,9 @@ class RegisterView(TemplateView):
form = UserRegisterForm(request.POST) form = UserRegisterForm(request.POST)
if not form.is_valid(): if not form.is_valid():
return render(request=request, template_name="users/register.html", context={"form": form}) return render(request=request, template_name="users/register.html", context={"form": form})
login(request=request, user=form.save()) user = form.save()
init_player(request=request, user=user)
login(request=request, user=user)
return redirect("bloonsa_game:game") return redirect("bloonsa_game:game")
@ -39,6 +45,7 @@ class LogoutView(TemplateView):
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
if request.user.is_authenticated: if request.user.is_authenticated:
tag_player(request=request)
logout(request) logout(request)
return redirect("bloonsa_game:game") return redirect("bloonsa_game:game")