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:
|
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)
|
||||||
|
|||||||
@ -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 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}]")
|
||||||
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/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 %}
|
||||||
|
|||||||
@ -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) => {
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
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.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 = {
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user