Finally made js exec work
This commit is contained in:
parent
cb3752dcb7
commit
c9a50e06a7
@ -28,7 +28,7 @@ class LoadLevel(CSRFexemptTemplateView):
|
||||
if request.user.is_authenticated:
|
||||
bloonsa_util.tag_player(request=request)
|
||||
player = Player.objects.get(user=request.user)
|
||||
player.bloonsa_levelsPlayed.add(level)
|
||||
player.bloonsa_levels_played.add(level)
|
||||
bloonsa_util.log(player=player,
|
||||
action=actions.bloonsa_load_level_by_id,
|
||||
note=level.levelId)
|
||||
@ -45,7 +45,7 @@ class RandomLevel(CSRFexemptTemplateView):
|
||||
if request.user.is_authenticated:
|
||||
bloonsa_util.tag_player(request=request)
|
||||
player = Player.objects.get(user=request.user)
|
||||
player.bloonsa_levelsPlayed.add(level)
|
||||
level.played_by.add(player)
|
||||
bloonsa_util.log(player=player,
|
||||
action=actions.bloonsa_load_random_level,
|
||||
note=level.levelId)
|
||||
@ -95,21 +95,20 @@ class RateLevel(CSRFexemptTemplateView):
|
||||
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()
|
||||
|
||||
ratingObject = Player.objects.filter(bloonsa_level_ratings__level=level).first()
|
||||
bloonsa_util.log(player=player,
|
||||
action=actions.bloonsa_rate_level,
|
||||
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(status=400)
|
||||
|
||||
@ -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'),
|
||||
),
|
||||
]
|
||||
19
app/bloonsa_game/migrations/0016_level_played_by.py
Normal file
19
app/bloonsa_game/migrations/0016_level_played_by.py
Normal 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'),
|
||||
),
|
||||
]
|
||||
19
app/bloonsa_game/migrations/0017_alter_levelrating_rating.py
Normal file
19
app/bloonsa_game/migrations/0017_alter_levelrating_rating.py
Normal 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)]),
|
||||
),
|
||||
]
|
||||
@ -1,5 +1,9 @@
|
||||
from django.core.validators import MinValueValidator, MaxValueValidator
|
||||
from django.db import models
|
||||
|
||||
from users.models import Player
|
||||
|
||||
|
||||
class Author(models.Model):
|
||||
name = models.CharField(max_length=255)
|
||||
authorId = models.IntegerField()
|
||||
@ -18,6 +22,8 @@ class Level(models.Model):
|
||||
rating = models.FloatField(null=True, blank=True)
|
||||
data = models.CharField(max_length=288)
|
||||
|
||||
played_by = models.ManyToManyField(Player, blank=True, related_name="bloonsa_levels_played")
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.author} - {self.title}"
|
||||
|
||||
@ -38,16 +44,19 @@ class Level(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)
|
||||
rating = models.SmallIntegerField()
|
||||
rating = models.SmallIntegerField(validators=[MinValueValidator(1),
|
||||
MaxValueValidator(10)])
|
||||
|
||||
def __str__(self):
|
||||
return (f"{self.player.first().user.username}"
|
||||
return (f"{self.player.user.username}"
|
||||
f" - [<{int(self.rating) * '★'}> - {self.level.title}]")
|
||||
|
||||
# There should only be 1 score per player
|
||||
# Highest popcount wins
|
||||
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)
|
||||
clear = models.BooleanField(default=True) # This is for if we ever submit scores for failed attempts
|
||||
darts_left = models.PositiveSmallIntegerField(null=True)
|
||||
@ -55,5 +64,5 @@ class LevelScore(models.Model):
|
||||
|
||||
def __str__(self):
|
||||
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}]")
|
||||
Binary file not shown.
@ -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/append.css' %}"/>
|
||||
<script>window.RufflePlayer=window.RufflePlayer||{};
|
||||
window.RufflePlayer.config={"autoplay":"on",
|
||||
window.RufflePlayer.config={
|
||||
"autoplay":"on",
|
||||
"unmuteOverlay":"hidden",
|
||||
"allowScriptAccess": true,
|
||||
"quality": "high",
|
||||
"splashScreen": false,
|
||||
"menu": false,
|
||||
"polyfills": true,};</script>
|
||||
"quality": "high",
|
||||
"splashScreen": false,
|
||||
"menu": false,
|
||||
"polyfills": false,
|
||||
};</script>
|
||||
<script src="{% static 'bloonsa_game/misc/ruffle/ruffle.js' %}"></script>
|
||||
<script src="{% static 'bloonsa_game/js/flash_handler.js' %}"></script>
|
||||
{% if head %}
|
||||
|
||||
@ -15,12 +15,13 @@
|
||||
width="640" height="480" title="" allowScriptAccess=true>
|
||||
<param name="movie" value="{% static 'bloonsa_game/misc/bloons_unlimited.swf' %}">
|
||||
<param name="quality" value="high">
|
||||
<param name="allowscriptaccess" value="always" />
|
||||
<embed src="{% static 'bloonsa_game/misc/bloons_unlimited.swf' %}"
|
||||
quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer"
|
||||
type="application/x-shockwave-flash"
|
||||
width="640" height="480" allowScriptAccess=true>
|
||||
</object>-->
|
||||
<div id="bloonsa-game"></div>
|
||||
<div id="bloonsa-game" allowScriptAccess=true></div>
|
||||
<script>
|
||||
window.RufflePlayer = window.RufflePlayer || {};
|
||||
window.addEventListener("load", (event) => {
|
||||
|
||||
@ -1,8 +1,5 @@
|
||||
import os
|
||||
|
||||
from django.shortcuts import render
|
||||
from django.views.generic import TemplateView
|
||||
from django.views.static import serve
|
||||
|
||||
from bloonsa_game.models import Level
|
||||
from users.util import bloonsa_util, actions
|
||||
|
||||
@ -1,12 +1,18 @@
|
||||
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):
|
||||
# list_display = ("id", "user")
|
||||
# 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(Player, PlayerAdmin)
|
||||
admin.site.register(Log)
|
||||
|
||||
18
app/users/migrations/0020_alter_log_action.py
Normal file
18
app/users/migrations/0020_alter_log_action.py
Normal 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')]),
|
||||
),
|
||||
]
|
||||
@ -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',
|
||||
),
|
||||
]
|
||||
@ -2,15 +2,12 @@ from django.db import models
|
||||
from django.utils import timezone
|
||||
from django.contrib.auth.models import User
|
||||
|
||||
from bloonsa_game.models import Level, LevelRating, LevelScore
|
||||
|
||||
|
||||
class Player(models.Model):
|
||||
user = models.OneToOneField(User, on_delete=models.CASCADE, null=True, blank=True, related_name="player")
|
||||
# Savedata
|
||||
bloonsa_levelsPlayed = models.ManyToManyField(Level, 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_levelsPlayed = models.ManyToManyField(Level, 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")
|
||||
# Logging
|
||||
creationIP = 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
|
||||
@property
|
||||
def levels_played(self):
|
||||
return self.bloonsa_levelsPlayed.count()
|
||||
return self.bloonsa_levels_played.count()
|
||||
|
||||
@property
|
||||
def levels_beaten(self):
|
||||
@ -34,7 +31,8 @@ class Player(models.Model):
|
||||
|
||||
@property
|
||||
def total_levels(self):
|
||||
return Level.objects.all().count()
|
||||
# TODO
|
||||
return 0
|
||||
|
||||
def __str__(self):
|
||||
statesDict = {
|
||||
|
||||
@ -55,7 +55,7 @@ class BloonsaUtil:
|
||||
if not self.tracking:
|
||||
return
|
||||
if not player:
|
||||
if not request:
|
||||
if not request and not request.user.is_authenticated:
|
||||
return
|
||||
player = self.init_player(request=request)
|
||||
item = Log(player=player,
|
||||
|
||||
Loading…
Reference in New Issue
Block a user