diff --git a/app/bloonsa_api/views.py b/app/bloonsa_api/views.py index 1e2a469..be33800 100644 --- a/app/bloonsa_api/views.py +++ b/app/bloonsa_api/views.py @@ -4,12 +4,8 @@ from django.views.generic import TemplateView from django.utils.decorators import method_decorator from django.views.decorators.csrf import csrf_exempt -import random -import time - -# Create your views here. - from bloonsa_game.models import Level +from users.util import tag_player class CSRFexemptTemplateView(TemplateView): @@ -21,6 +17,7 @@ class CSRFexemptTemplateView(TemplateView): class LoadLevel(CSRFexemptTemplateView): def post(self, request, *args, **kwargs): + tag_player(request=request) levelNum = request.POST.get("level_num") if levelNum is None or not levelNum.isdigit(): return HttpResponseBadRequest() @@ -35,19 +32,23 @@ class LoadLevel(CSRFexemptTemplateView): class RandomLevel(CSRFexemptTemplateView): def post(self, request, *args, **kwargs): + tag_player(request=request) level = Level.objects.order_by("?").first() flashVars = level.getFlashVars(seperator="&") return HttpResponse(flashVars) def get(self, request, *args, **kwargs): + tag_player(request=request) level = Level.objects.order_by("?").first() flashVars = level.getFlashVars(seperator="&") return HttpResponse(flashVars) class CompleteLevel(CSRFexemptTemplateView): def post(self, request, *args, **kwargs): + tag_player(request=request) pass class RateLevel(CSRFexemptTemplateView): def post(self, request, *args, **kwargs): + tag_player(request=request) pass diff --git a/app/bloonsa_game/admin.py b/app/bloonsa_game/admin.py index d402a97..b6cc388 100644 --- a/app/bloonsa_game/admin.py +++ b/app/bloonsa_game/admin.py @@ -1,7 +1,6 @@ from django.contrib import admin from .models import Level, Author -# Register your models here. admin.site.register(Level) admin.site.register(Author) \ No newline at end of file diff --git a/app/bloonsa_game/views.py b/app/bloonsa_game/views.py index 1b5a5d1..b409823 100644 --- a/app/bloonsa_game/views.py +++ b/app/bloonsa_game/views.py @@ -1,24 +1,26 @@ -from django.contrib.auth.forms import AuthenticationForm from django.shortcuts import render from django.views.generic import TemplateView -# Create your views here. from bloonsa_game.models import Level +from users.util import tag_player class IndexView(TemplateView): def get(self, request, *args, **kwargs): + tag_player(request=request) return render(request, "bloonsa_game/index.html", context={}) class TermsView(TemplateView): def get(self, request, *args, **kwargs): + tag_player(request=request) return render(request, "bloonsa_game/terms.html", context={}) class GameView(TemplateView): def get(self, request, *args, **kwargs): + tag_player(request=request) if type(kwargs.get("pk")) is int: level = Level.objects.get(id=kwargs["pk"]) if level: diff --git a/app/users/admin.py b/app/users/admin.py index 8c38f3f..f8e31c5 100644 --- a/app/users/admin.py +++ b/app/users/admin.py @@ -1,3 +1,5 @@ from django.contrib import admin -# Register your models here. +from .models import Player, User + +admin.site.register(Player) diff --git a/app/users/forms.py b/app/users/forms.py index 56af148..f2d882b 100644 --- a/app/users/forms.py +++ b/app/users/forms.py @@ -62,4 +62,10 @@ class UserLoginForm(AuthenticationForm): username = forms.CharField(min_length=3, max_length=16, label="Username", - required=True) \ No newline at end of file + required=True) + + class Meta: + model = User + fields = [ + "username", + ] \ No newline at end of file diff --git a/app/users/models.py b/app/users/models.py index 64683d1..b55c7ea 100644 --- a/app/users/models.py +++ b/app/users/models.py @@ -5,6 +5,8 @@ from django.contrib.auth.models import User from bloonsa_game.models import Level + + class Player(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True) # Savedata @@ -20,4 +22,7 @@ class Player(models.Model): # States suspended = models.BooleanField(default=False) banned = models.BooleanField(default=False) - admin = models.BooleanField(default=False) \ No newline at end of file + admin = models.BooleanField(default=False) + + def __str__(self): + return f"{self.user} - {self.latestIP}" \ No newline at end of file diff --git a/app/users/util.py b/app/users/util.py new file mode 100644 index 0000000..e3445f9 --- /dev/null +++ b/app/users/util.py @@ -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() \ No newline at end of file diff --git a/app/users/views.py b/app/users/views.py index ba6fc0f..1d49564 100644 --- a/app/users/views.py +++ b/app/users/views.py @@ -4,6 +4,8 @@ from django.shortcuts import render, redirect from django.views.generic import TemplateView from users.forms import UserRegisterForm, UserLoginForm +from users.models import Player +from users.util import init_player, tag_player class LoginView(TemplateView): @@ -16,7 +18,9 @@ class LoginView(TemplateView): form = UserLoginForm(data=request.POST) if not form.is_valid(): 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") @@ -30,7 +34,9 @@ class RegisterView(TemplateView): form = UserRegisterForm(request.POST) if not form.is_valid(): 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") @@ -39,6 +45,7 @@ class LogoutView(TemplateView): def get(self, request, *args, **kwargs): if request.user.is_authenticated: + tag_player(request=request) logout(request) return redirect("bloonsa_game:game")