from django.db import models from django.utils import timezone from django.contrib.auth.models import User from bloonsa_game.models import Level, LevelRating class Player(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name="player") # Savedata bloonsa_levelsPlayed = models.ManyToManyField(Level, blank=True, related_name="levelsPlayed") bloonsa_levelsBeaten = models.ManyToManyField(Level, blank=True, related_name="levelsBeaten") bloonsa_levelRatings = models.ManyToManyField(LevelRating, blank=True, related_name="player") # Logging creationIP = models.GenericIPAddressField() latestIP = models.GenericIPAddressField() creationDate = models.DateTimeField(default=timezone.now) latestActivity = models.DateTimeField(default=timezone.now) suspectedCheater = models.BooleanField(default=False) # This should be set when tripping the anti-cheat # States suspended = models.BooleanField(default=False) # This is a shadow-ban, stats will still save but not all will show up on leaderboards banned = models.BooleanField(default=False) # Account gets logged out upon logging in admin = models.BooleanField(default=False) # Ability to suspend/ban other players @property def levels_played(self): return self.bloonsa_levelsPlayed.count() @property def levels_beaten(self): return self.bloonsa_levelsBeaten.count() @property def total_levels(self): return Level.objects.all().count() def __str__(self): statesDict = { "cheater": "😈" if self.suspectedCheater else "", "suspended": "🔒" if self.suspended else "", "banned": "❌" if self.banned else "", "admin": "👑" if self.admin else "", } states = "".join(statesDict.values()) if states: states += " " return f"{states}{self.user} - {self.latestIP}"