From 20321f0bb44df353f19e7786e06fb0234a94542c Mon Sep 17 00:00:00 2001 From: Michiel Scholten Date: Fri, 22 Nov 2024 13:05:52 +0100 Subject: [PATCH 1/6] Use UTC for calculating the current game --- src/alfagok/main.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/alfagok/main.py b/src/alfagok/main.py index 9f94459..38fa576 100644 --- a/src/alfagok/main.py +++ b/src/alfagok/main.py @@ -1,6 +1,6 @@ """Main alfagok API application.""" import logging -from datetime import date +from datetime import date, datetime, timezone from typing import Union from fastapi import FastAPI, Request @@ -51,7 +51,7 @@ if settings.debug: def get_game_id(): """Calculate the index for the game/word we are handling today.""" - today = date.today() + today = datetime.now(timezone.utc).date() # Calculate the amount of days since the start of the games so we know which word is used today return (today - settings.start_date).days @@ -71,7 +71,7 @@ async def index(request: Request): @app.get('/api/game') def what_game(): - """Handle incoming guess.""" + """Which game is currently on?""" return {'game': get_game_id()} From 1ce340853f81766326b0af88fa3ed6413cd5cf8f Mon Sep 17 00:00:00 2001 From: Michiel Scholten Date: Fri, 22 Nov 2024 13:05:56 +0100 Subject: [PATCH 2/6] Use CSS to style centering the guess lists --- src/alfagok/static/game.css | 4 ++ src/alfagok/templates/index.html | 66 +++++++++++++++----------------- 2 files changed, 35 insertions(+), 35 deletions(-) diff --git a/src/alfagok/static/game.css b/src/alfagok/static/game.css index faff120..bd0772b 100644 --- a/src/alfagok/static/game.css +++ b/src/alfagok/static/game.css @@ -37,6 +37,10 @@ a.title { color: #CCC;; } +.guessesheading, .guessesbefore, .guessesafter { + text-align: center; +} + input[type="text"] { box-sizing: border-box; width: 100%; diff --git a/src/alfagok/templates/index.html b/src/alfagok/templates/index.html index 22382b3..b30c295 100644 --- a/src/alfagok/templates/index.html +++ b/src/alfagok/templates/index.html @@ -24,47 +24,43 @@

-
+

Het woord van de dag komt na:

+
    + +
-

Het woord van de dag komt na:

-
    - -
- -
- +
+ {#

Je huidige gok is:

#} - -

-
+ +

+
-
-

Je hebt hem! 🎉

-

Het woord van vandaag was .

-
-
-

-

-

-

🔗 alfagok.diginaut.net

-
+
+

Je hebt hem! 🎉

+

Het woord van vandaag was .

+
+
+

+

+

+

🔗 alfagok.diginaut.net

-
-
+
+ +
-

Het woord van de dag komt voor:

-
    - -
- -
+

Het woord van de dag komt voor:

+ From 28ff9368bbecdfdf64fb640b11a6c88d19db431d Mon Sep 17 00:00:00 2001 From: Michiel Scholten Date: Sat, 23 Nov 2024 13:24:45 +0100 Subject: [PATCH 3/6] var-b-let --- src/alfagok/static/game.js | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/alfagok/static/game.js b/src/alfagok/static/game.js index 0ea9245..e1e7457 100644 --- a/src/alfagok/static/game.js +++ b/src/alfagok/static/game.js @@ -135,7 +135,7 @@ function getFormattedTime(milliseconds) { /* Clipboard stuff **/ -var clip = new Clipboard('.copy'); +let clip = new Clipboard('.copy'); clip.on("success", function(e) { document.getElementById('copyresults').innerHTML = '

Gekopieerd! Deel je resultaat.

'; @@ -150,23 +150,23 @@ clip.on("error", function() { /* Game timer, original from alphaguess.com **/ function go() { - window.timerID = window.setInterval(timer, 0); + window.timerID = window.setInterval(timer, 0); } function timer(){ - var nextgame = document.getElementById('nextgame'); - var now = new Date(); - var midnight = new Date(now.getFullYear(), now.getMonth(), now.getDate()+1, 0, 0, 0); - var diff = Math.floor((midnight - now)/1000); - var hoursRemain = Math.floor(diff/(60*60)); - var minutesRemain = Math.floor((diff-hoursRemain*60*60)/60); - var secondsRemain = Math.floor(diff%60); - nextgame.innerHTML = ''+addZero(hoursRemain)+':'+addZero(minutesRemain)+':'+addZero(secondsRemain)+' over'; + let nextgame = document.getElementById('nextgame'); + let now = new Date(); + let midnight = new Date(now.getFullYear(), now.getMonth(), now.getDate()+1, 0, 0, 0); + let diff = Math.floor((midnight - now)/1000); + let hoursRemain = Math.floor(diff/(60*60)); + let minutesRemain = Math.floor((diff-hoursRemain*60*60)/60); + let secondsRemain = Math.floor(diff%60); + nextgame.innerHTML = ''+addZero(hoursRemain)+':'+addZero(minutesRemain)+':'+addZero(secondsRemain)+' over'; } function addZero(num){ - if(num <=9) return '0'+num; - else return num; + if(num <=9) return '0'+num; + else return num; } go(); From 622d3d9681c518a9b1e0cf309a9f49a8d29ffff8 Mon Sep 17 00:00:00 2001 From: Michiel Scholten Date: Sat, 23 Nov 2024 13:36:35 +0100 Subject: [PATCH 4/6] Latest clipboard.js --- src/alfagok/static/game.js | 2 +- src/alfagok/templates/index.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/alfagok/static/game.js b/src/alfagok/static/game.js index e1e7457..af8810d 100644 --- a/src/alfagok/static/game.js +++ b/src/alfagok/static/game.js @@ -135,7 +135,7 @@ function getFormattedTime(milliseconds) { /* Clipboard stuff **/ -let clip = new Clipboard('.copy'); +let clip = new ClipboardJS('.copy'); clip.on("success", function(e) { document.getElementById('copyresults').innerHTML = '

Gekopieerd! Deel je resultaat.

'; diff --git a/src/alfagok/templates/index.html b/src/alfagok/templates/index.html index b30c295..17e7d2d 100644 --- a/src/alfagok/templates/index.html +++ b/src/alfagok/templates/index.html @@ -64,7 +64,7 @@ - + {# From cc20e80bf537441729bcc60047f4fee02545559c Mon Sep 17 00:00:00 2001 From: Michiel Scholten Date: Sat, 23 Nov 2024 14:05:46 +0100 Subject: [PATCH 5/6] Initial support for server-sourced deadline --- src/alfagok/main.py | 10 +++++++- src/alfagok/static/game.js | 41 ++++++++++++++++++++++++++++++++ src/alfagok/templates/index.html | 2 +- 3 files changed, 51 insertions(+), 2 deletions(-) diff --git a/src/alfagok/main.py b/src/alfagok/main.py index 38fa576..47cf314 100644 --- a/src/alfagok/main.py +++ b/src/alfagok/main.py @@ -56,6 +56,14 @@ def get_game_id(): return (today - settings.start_date).days +def get_game_deadline(): + """Calculate the amount of time left for the current game.""" + this_moment = datetime.now(timezone.utc) + midnight = datetime.now(timezone.utc).replace(hour=23, minute=59, second=59, microsecond=0) + # Calculate the amount of time left till midnight (and the start of the next game) + return midnight - this_moment + + def is_valid_dictionary_word(word: str) -> bool: """Verify if `word` is in the dictionary provided.""" # Either we: [ ] strip all the endlines during file load, or [x] use the endline to search here @@ -72,7 +80,7 @@ async def index(request: Request): @app.get('/api/game') def what_game(): """Which game is currently on?""" - return {'game': get_game_id()} + return {'game': get_game_id(), 'deadline': get_game_deadline()} @app.get('/api/guess/{word}') diff --git a/src/alfagok/static/game.js b/src/alfagok/static/game.js index af8810d..bbdf74d 100644 --- a/src/alfagok/static/game.js +++ b/src/alfagok/static/game.js @@ -2,6 +2,7 @@ document.addEventListener('alpine:init', () => { Alpine.store('alfagok', { /* Main alfagok application, state etc */ gameID: 0, + countingDown: '', loading: false, @@ -88,7 +89,47 @@ document.addEventListener('alpine:init', () => { this.resultGuesses = '🤔 '+ this.nrGuesses + ' gokken'; this.resultTimeTaken = '⏱️ ' + getFormattedTime(this.winTime - this.startTime); } + }, + + + getFormattedTime(milliseconds) { + if (!Number.isInteger(milliseconds)) { + return ''; + } + let seconds = Math.round((milliseconds) / 1000); + const hours = Math.floor(seconds / 3600); + seconds %= 3600; + const minutes = Math.floor(seconds / 60); + seconds %= 60; + + const formattedTime = []; + if (hours) { + formattedTime.push(`${hours}u`); + } + if (minutes) { + formattedTime.push(`${minutes}m`); + } + if (seconds) { + formattedTime.push(`${seconds}s`); + } + + return formattedTime.join(' ') || '0s'; + }, + addZero(num){ + if(num <=9) return '0'+num; + else return num; + }, + countDownTimer(){ + let nextgame = document.getElementById('nextgame'); + let now = new Date(); + let midnight = new Date(now.getFullYear(), now.getMonth(), now.getDate()+1, 0, 0, 0); + let diff = Math.floor((midnight - now)/1000); + let hoursRemain = Math.floor(diff/(60*60)); + let minutesRemain = Math.floor((diff-hoursRemain*60*60)/60); + let secondsRemain = Math.floor(diff%60); + nextgame.innerHTML = ''+addZero(hoursRemain)+':'+addZero(minutesRemain)+':'+addZero(secondsRemain)+' over'; } + }), Alpine.store('darkMode', { diff --git a/src/alfagok/templates/index.html b/src/alfagok/templates/index.html index 17e7d2d..f06205f 100644 --- a/src/alfagok/templates/index.html +++ b/src/alfagok/templates/index.html @@ -17,7 +17,7 @@
- alfagok puzzel # gokken + alfagok puzzel # | gokken

Raad het woord van de dag. Elke gok geeft een hint over waar het woord zich in het alfabet bevindt.

From e7a39becfca6f15108e7835fd7450ec44231b3a3 Mon Sep 17 00:00:00 2001 From: Michiel Scholten Date: Sat, 23 Nov 2024 21:18:18 +0100 Subject: [PATCH 6/6] Latest requirements --- requirements-server.txt | 6 +++--- requirements.txt | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/requirements-server.txt b/requirements-server.txt index 114cc87..8250295 100644 --- a/requirements-server.txt +++ b/requirements-server.txt @@ -50,11 +50,11 @@ mdurl==0.1.2 # via markdown-it-py packaging==24.2 # via gunicorn -pydantic==2.9.2 +pydantic==2.10.1 # via # fastapi # pydantic-settings -pydantic-core==2.23.4 +pydantic-core==2.27.1 # via pydantic pydantic-settings==2.6.1 # via -r requirements.in @@ -86,7 +86,7 @@ typing-extensions==4.12.2 # pydantic # pydantic-core # typer -uvicorn==0.32.0 +uvicorn==0.32.1 # via # fastapi # fastapi-cli diff --git a/requirements.txt b/requirements.txt index a1fceca..217bd15 100644 --- a/requirements.txt +++ b/requirements.txt @@ -46,11 +46,11 @@ markupsafe==3.0.2 # via jinja2 mdurl==0.1.2 # via markdown-it-py -pydantic==2.9.2 +pydantic==2.10.1 # via # fastapi # pydantic-settings -pydantic-core==2.23.4 +pydantic-core==2.27.1 # via pydantic pydantic-settings==2.6.1 # via -r requirements.in @@ -82,7 +82,7 @@ typing-extensions==4.12.2 # pydantic # pydantic-core # typer -uvicorn==0.32.0 +uvicorn==0.32.1 # via # fastapi # fastapi-cli