From b36c38fd60f1aef15f1e5edba4d2c6cc3e20303c Mon Sep 17 00:00:00 2001 From: Danhia Date: Sat, 12 Feb 2022 19:56:46 +0100 Subject: [PATCH] dynamic scoring for events, i'm pretty sure everything is gonna break --- src/events/migrations/0008_event_dynamic.py | 18 +++++++++++++ src/events/models.py | 1 + src/events/templates/events/ctf_info.html | 2 +- src/events/views/events.py | 28 +++++++++++++++++++-- 4 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 src/events/migrations/0008_event_dynamic.py diff --git a/src/events/migrations/0008_event_dynamic.py b/src/events/migrations/0008_event_dynamic.py new file mode 100644 index 0000000..45db268 --- /dev/null +++ b/src/events/migrations/0008_event_dynamic.py @@ -0,0 +1,18 @@ +# Generated by Django 3.1.5 on 2022-02-12 18:27 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('events', '0007_event_auto_match'), + ] + + operations = [ + migrations.AddField( + model_name='event', + name='dynamic', + field=models.BooleanField(default=False), + ), + ] diff --git a/src/events/models.py b/src/events/models.py index 7f2f120..6b8b0b0 100644 --- a/src/events/models.py +++ b/src/events/models.py @@ -16,6 +16,7 @@ class Event(models.Model): slug = models.SlugField(max_length=55) team_size = models.PositiveIntegerField(default=1) auto_match = models.BooleanField(default=False) + dynamic = models.BooleanField(default=False) def __str__(self): return self.name diff --git a/src/events/templates/events/ctf_info.html b/src/events/templates/events/ctf_info.html index 8984a7b..65a2c5f 100644 --- a/src/events/templates/events/ctf_info.html +++ b/src/events/templates/events/ctf_info.html @@ -29,7 +29,7 @@ {% elif errorform == True %}

{% trans "Error while processing your request. (Invalid Form)" %}

{% elif notsub == True %} - {% trans "Error: you're not registered to this event, so you can't register scores, fucking logic." %} + {% trans "You must register to the event before submitting flags." %} {% elif noteam == True %} {% trans "This is a team event, please create or join a team before submitting flags." %} {% if ctf.ctf_url %} diff --git a/src/events/views/events.py b/src/events/views/events.py index 7a8eb95..220e543 100644 --- a/src/events/views/events.py +++ b/src/events/views/events.py @@ -7,6 +7,7 @@ from ctfs.models import CTF, CTF_flags, Category from django.utils.translation import get_language from django.contrib.auth.models import User from django.utils.translation import gettext_lazy as _ +from math import log def get_description_by_lang(ctf): lang = get_language() @@ -21,6 +22,24 @@ def get_description_by_lang(ctf): ret = ctf.description_ru return ret +def actualize_points(ctf): + solves = CTF_flags.objects.filter(ctf=ctf) + nb_solves = len(solves) + + new_points = max(50 - int(log(nb_solves)*2.5)*5, 5) + + if new_points != ctf.points: + diff = ctf.points - new_points + ctf.points = new_points + ctf.save() + for s in solves: + player = EventPlayer.objects.get(event=ctf.event, user=s.user) + player.score -= diff + player.save() + if player.team: + player.team.score -= diff + player.team.save() + # Create your views here. def events(request): list_events = Event.objects.filter().order_by('-end_date', 'start_date') @@ -115,6 +134,7 @@ def event(request, event_slug): def submit_event_flag(request, event_slug, chall_slug): ev = get_object_or_404(Event, slug=event_slug) response = redirect('events:event_chall_info', event_slug=event_slug, chall_slug=chall_slug) + flagged = False if timezone.now() >= ev.end_date: response['Location'] += '?EventIsOver=1' @@ -126,8 +146,10 @@ def submit_event_flag(request, event_slug, chall_slug): response['Location'] += '?ChallengeNotFound=1' return response - flagged = False - player = EventPlayer.objects.get(user=request.user, event=ev) + try: + player = EventPlayer.objects.get(event=ev, user=request.user) + except: + player = None if player: if ev.team_size > 1 and player.team is None: @@ -160,6 +182,8 @@ def submit_event_flag(request, event_slug, chall_slug): player.team.last_submission_date = timezone.now() player.team.score += ctf_info.points player.team.save() + if ev.dynamic: + actualize_points(ctf_info) response['Location'] += '?Congrat=1' return response else: