Finally made js exec work

This commit is contained in:
Walter 2025-02-14 05:22:05 +01:00
parent cb3752dcb7
commit c9a50e06a7
14 changed files with 157 additions and 39 deletions

View File

@ -28,7 +28,7 @@ class LoadLevel(CSRFexemptTemplateView):
if request.user.is_authenticated: if request.user.is_authenticated:
bloonsa_util.tag_player(request=request) bloonsa_util.tag_player(request=request)
player = Player.objects.get(user=request.user) player = Player.objects.get(user=request.user)
player.bloonsa_levelsPlayed.add(level) player.bloonsa_levels_played.add(level)
bloonsa_util.log(player=player, bloonsa_util.log(player=player,
action=actions.bloonsa_load_level_by_id, action=actions.bloonsa_load_level_by_id,
note=level.levelId) note=level.levelId)
@ -45,7 +45,7 @@ class RandomLevel(CSRFexemptTemplateView):
if request.user.is_authenticated: if request.user.is_authenticated:
bloonsa_util.tag_player(request=request) bloonsa_util.tag_player(request=request)
player = Player.objects.get(user=request.user) player = Player.objects.get(user=request.user)
player.bloonsa_levelsPlayed.add(level) level.played_by.add(player)
bloonsa_util.log(player=player, bloonsa_util.log(player=player,
action=actions.bloonsa_load_random_level, action=actions.bloonsa_load_random_level,
note=level.levelId) note=level.levelId)
@ -95,21 +95,20 @@ class RateLevel(CSRFexemptTemplateView):
level_id = int(request.POST.get("level_id")) level_id = int(request.POST.get("level_id"))
level = Level.objects.get(levelId=level_id) level = Level.objects.get(levelId=level_id)
player = Player.objects.get(user=request.user) player = Player.objects.get(user=request.user)
ratingObject = Player.objects.filter(bloonsa_levelRatings__level=level).first() ratingObject = Player.objects.filter(bloonsa_level_ratings__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, bloonsa_util.log(player=player,
action=actions.bloonsa_rate_level, action=actions.bloonsa_rate_level,
note=level.levelId) note=level.levelId)
if ratingObject:
ratingObject.rating = rating
ratingObject.save()
return HttpResponse(content="OK", status=200)
rating = LevelRating.objects.create(level=level,
rating=rating)
player.bloonsa_level_ratings.add(rating)
rating.save()
player.save()
return HttpResponse(content="OK", status=200) return HttpResponse(content="OK", status=200)
return HttpResponse(status=400) return HttpResponse(status=400)

View File

@ -0,0 +1,25 @@
# Generated by Django 5.1.6 on 2025-02-14 03:01
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('bloonsa_game', '0014_alter_levelscore_level'),
('users', '0021_remove_player_bloonsa_levelratings_and_more'),
]
operations = [
migrations.AddField(
model_name='levelrating',
name='player',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='bloonsa_level_ratings', to='users.player'),
),
migrations.AddField(
model_name='levelscore',
name='player',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='bloonsa_level_scores', to='users.player'),
),
]

View File

@ -0,0 +1,19 @@
# Generated by Django 5.1.6 on 2025-02-14 03:04
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('bloonsa_game', '0015_levelrating_player_levelscore_player'),
('users', '0021_remove_player_bloonsa_levelratings_and_more'),
]
operations = [
migrations.AddField(
model_name='level',
name='played_by',
field=models.ManyToManyField(blank=True, related_name='bloonsa_levels_played', to='users.player'),
),
]

View File

@ -0,0 +1,19 @@
# Generated by Django 5.1.6 on 2025-02-14 03:16
import django.core.validators
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('bloonsa_game', '0016_level_played_by'),
]
operations = [
migrations.AlterField(
model_name='levelrating',
name='rating',
field=models.SmallIntegerField(validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(10)]),
),
]

View File

@ -1,5 +1,9 @@
from django.core.validators import MinValueValidator, MaxValueValidator
from django.db import models from django.db import models
from users.models import Player
class Author(models.Model): class Author(models.Model):
name = models.CharField(max_length=255) name = models.CharField(max_length=255)
authorId = models.IntegerField() authorId = models.IntegerField()
@ -18,6 +22,8 @@ class Level(models.Model):
rating = models.FloatField(null=True, blank=True) rating = models.FloatField(null=True, blank=True)
data = models.CharField(max_length=288) data = models.CharField(max_length=288)
played_by = models.ManyToManyField(Player, blank=True, related_name="bloonsa_levels_played")
def __str__(self): def __str__(self):
return f"{self.author} - {self.title}" return f"{self.author} - {self.title}"
@ -38,16 +44,19 @@ class Level(models.Model):
class LevelRating(models.Model): class LevelRating(models.Model):
player = models.ForeignKey(Player, on_delete=models.CASCADE, related_name="bloonsa_level_ratings", null=True)
level = models.ForeignKey(Level, on_delete=models.CASCADE) level = models.ForeignKey(Level, on_delete=models.CASCADE)
rating = models.SmallIntegerField() rating = models.SmallIntegerField(validators=[MinValueValidator(1),
MaxValueValidator(10)])
def __str__(self): def __str__(self):
return (f"{self.player.first().user.username}" return (f"{self.player.user.username}"
f" - [<{int(self.rating) * ''}> - {self.level.title}]") f" - [<{int(self.rating) * ''}> - {self.level.title}]")
# There should only be 1 score per player # There should only be 1 score per player
# Highest popcount wins # Highest popcount wins
class LevelScore(models.Model): class LevelScore(models.Model):
player = models.ForeignKey(Player, on_delete=models.CASCADE, related_name="bloonsa_level_scores", null=True)
level = models.ForeignKey(Level, on_delete=models.CASCADE) level = models.ForeignKey(Level, on_delete=models.CASCADE)
clear = models.BooleanField(default=True) # This is for if we ever submit scores for failed attempts clear = models.BooleanField(default=True) # This is for if we ever submit scores for failed attempts
darts_left = models.PositiveSmallIntegerField(null=True) darts_left = models.PositiveSmallIntegerField(null=True)
@ -55,5 +64,5 @@ class LevelScore(models.Model):
def __str__(self): def __str__(self):
clearState = "" if self.clear else "" clearState = "" if self.clear else ""
return (f"{self.player.first().user.username}'s {clearState} @ {self.level.title}" return (f"{self.player.user.username}'s {clearState} @ {self.level.title}"
f"[🎈{self.pops} | 🎯{self.darts_left}]") f"[🎈{self.pops} | 🎯{self.darts_left}]")

View File

@ -26,13 +26,15 @@
<link rel="stylesheet" type="text/css" media="screen" href="{% static 'bloonsa_game/css/main.css' %}"/> <link rel="stylesheet" type="text/css" media="screen" href="{% static 'bloonsa_game/css/main.css' %}"/>
<link rel="stylesheet" type="text/css" media="screen" href="{% static 'bloonsa_game/css/append.css' %}"/> <link rel="stylesheet" type="text/css" media="screen" href="{% static 'bloonsa_game/css/append.css' %}"/>
<script>window.RufflePlayer=window.RufflePlayer||{}; <script>window.RufflePlayer=window.RufflePlayer||{};
window.RufflePlayer.config={"autoplay":"on", window.RufflePlayer.config={
"autoplay":"on",
"unmuteOverlay":"hidden", "unmuteOverlay":"hidden",
"allowScriptAccess": true, "allowScriptAccess": true,
"quality": "high", "quality": "high",
"splashScreen": false, "splashScreen": false,
"menu": false, "menu": false,
"polyfills": true,};</script> "polyfills": false,
};</script>
<script src="{% static 'bloonsa_game/misc/ruffle/ruffle.js' %}"></script> <script src="{% static 'bloonsa_game/misc/ruffle/ruffle.js' %}"></script>
<script src="{% static 'bloonsa_game/js/flash_handler.js' %}"></script> <script src="{% static 'bloonsa_game/js/flash_handler.js' %}"></script>
{% if head %} {% if head %}

View File

@ -15,12 +15,13 @@
width="640" height="480" title="" allowScriptAccess=true> width="640" height="480" title="" allowScriptAccess=true>
<param name="movie" value="{% static 'bloonsa_game/misc/bloons_unlimited.swf' %}"> <param name="movie" value="{% static 'bloonsa_game/misc/bloons_unlimited.swf' %}">
<param name="quality" value="high"> <param name="quality" value="high">
<param name="allowscriptaccess" value="always" />
<embed src="{% static 'bloonsa_game/misc/bloons_unlimited.swf' %}" <embed src="{% static 'bloonsa_game/misc/bloons_unlimited.swf' %}"
quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer"
type="application/x-shockwave-flash" type="application/x-shockwave-flash"
width="640" height="480" allowScriptAccess=true> width="640" height="480" allowScriptAccess=true>
</object>--> </object>-->
<div id="bloonsa-game"></div> <div id="bloonsa-game" allowScriptAccess=true></div>
<script> <script>
window.RufflePlayer = window.RufflePlayer || {}; window.RufflePlayer = window.RufflePlayer || {};
window.addEventListener("load", (event) => { window.addEventListener("load", (event) => {

View File

@ -1,8 +1,5 @@
import os
from django.shortcuts import render from django.shortcuts import render
from django.views.generic import TemplateView from django.views.generic import TemplateView
from django.views.static import serve
from bloonsa_game.models import Level from bloonsa_game.models import Level
from users.util import bloonsa_util, actions from users.util import bloonsa_util, actions

View File

@ -1,12 +1,18 @@
from django.contrib import admin from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import Player, LevelRating, Log from .models import Player, Log
from bloonsa_game.models import LevelRating
@admin.register(Player)
class PlayerAdmin(admin.ModelAdmin): class PlayerAdmin(admin.ModelAdmin):
# list_display = ("id", "user")
# These lag too much # These lag too much
exclude = ("bloonsa_levelsPlayed", "bloonsa_levelsBeaten") # exclude = ("bloonsa_levels_played", "bloonsa_levels_beaten")
def get_played_levels(self, obj):
return obj.bloonsa_levels_played.all()
admin.site.register(LevelRating) admin.site.register(LevelRating)
admin.site.register(Player, PlayerAdmin)
admin.site.register(Log) admin.site.register(Log)

View File

@ -0,0 +1,18 @@
# Generated by Django 5.1.6 on 2025-02-14 02:52
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('users', '0019_alter_log_action'),
]
operations = [
migrations.AlterField(
model_name='log',
name='action',
field=models.IntegerField(choices=[(0, 'Logged in'), (1, 'Registered'), (2, 'Logged out'), (100, 'Loaded a level via ingame ID box'), (101, 'Loaded a level via URL'), (102, 'Loaded a random level'), (103, 'Submitted a score on level_id'), (104, 'Rated a level')]),
),
]

View File

@ -0,0 +1,25 @@
# Generated by Django 5.1.6 on 2025-02-14 03:01
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('users', '0020_alter_log_action'),
]
operations = [
migrations.RemoveField(
model_name='player',
name='bloonsa_levelRatings',
),
migrations.RemoveField(
model_name='player',
name='bloonsa_level_scores',
),
migrations.RemoveField(
model_name='player',
name='bloonsa_levelsPlayed',
),
]

View File

@ -2,15 +2,12 @@ from django.db import models
from django.utils import timezone from django.utils import timezone
from django.contrib.auth.models import User from django.contrib.auth.models import User
from bloonsa_game.models import Level, LevelRating, LevelScore
class Player(models.Model): class Player(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, null=True, blank=True, related_name="player") user = models.OneToOneField(User, on_delete=models.CASCADE, null=True, blank=True, related_name="player")
# Savedata # Savedata
bloonsa_levelsPlayed = models.ManyToManyField(Level, blank=True, related_name="player") #bloonsa_levelsPlayed = models.ManyToManyField(Level, blank=True, related_name="player")
bloonsa_level_scores = models.ManyToManyField(LevelScore, blank=True, related_name="player") #bloonsa_level_scores = models.ManyToManyField(LevelScore, blank=True, related_name="player")
bloonsa_levelRatings = models.ManyToManyField(LevelRating, blank=True, related_name="player") #bloonsa_levelRatings = models.ManyToManyField(LevelRating, blank=True, related_name="player")
# Logging # Logging
creationIP = models.GenericIPAddressField() creationIP = models.GenericIPAddressField()
latestIP = models.GenericIPAddressField() latestIP = models.GenericIPAddressField()
@ -26,7 +23,7 @@ class Player(models.Model):
# If bloonsa_levels_played gets replaced then this needs to be updated # If bloonsa_levels_played gets replaced then this needs to be updated
@property @property
def levels_played(self): def levels_played(self):
return self.bloonsa_levelsPlayed.count() return self.bloonsa_levels_played.count()
@property @property
def levels_beaten(self): def levels_beaten(self):
@ -34,7 +31,8 @@ class Player(models.Model):
@property @property
def total_levels(self): def total_levels(self):
return Level.objects.all().count() # TODO
return 0
def __str__(self): def __str__(self):
statesDict = { statesDict = {

View File

@ -55,7 +55,7 @@ class BloonsaUtil:
if not self.tracking: if not self.tracking:
return return
if not player: if not player:
if not request: if not request and not request.user.is_authenticated:
return return
player = self.init_player(request=request) player = self.init_player(request=request)
item = Log(player=player, item = Log(player=player,