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 diff --git a/src/alfagok/main.py b/src/alfagok/main.py index 9f94459..47cf314 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,11 +51,19 @@ 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 +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 @@ -71,8 +79,8 @@ async def index(request: Request): @app.get('/api/game') def what_game(): - """Handle incoming guess.""" - return {'game': get_game_id()} + """Which game is currently on?""" + return {'game': get_game_id(), 'deadline': get_game_deadline()} @app.get('/api/guess/{word}') 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/static/game.js b/src/alfagok/static/game.js index 8d3bf09..829b06c 100644 --- a/src/alfagok/static/game.js +++ b/src/alfagok/static/game.js @@ -5,6 +5,7 @@ document.addEventListener('alpine:init', () => { /* Main alfagok application, state etc */ gameID: 0, + countingDown: '', loading: false, @@ -162,20 +163,42 @@ document.addEventListener('alpine:init', () => { this.guessValue = guessValue; } }, - resetSavedGames() { - localStorage.removeItem('saveGame'); - }, - testLocalStorage() { - // stolen from https://stackoverflow.com/questions/16427636/check-if-localstorage-is-available - const test = 'test'; - try { - localStorage.setItem(test, test); - localStorage.removeItem(test); - this.isLocalStorageAvailable = true; - } catch (e) { - this.isLocalStorageAvailable = false; + getFormattedTime(milliseconds) { + if (!Number.isInteger(milliseconds)) { + return ''; } - console.log('Local storage is available? ' + this.isLocalStorageAvailable); + 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'; } }), @@ -223,7 +246,7 @@ function getFormattedTime(milliseconds) { /* Clipboard stuff **/ -var clip = new Clipboard('.copy'); +let clip = new ClipboardJS('.copy'); clip.on("success", function(e) { document.getElementById('copyresults').innerHTML = '
Gekopieerd! Deel je resultaat.
'; @@ -238,23 +261,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(); diff --git a/src/alfagok/templates/index.html b/src/alfagok/templates/index.html index 22382b3..f06205f 100644 --- a/src/alfagok/templates/index.html +++ b/src/alfagok/templates/index.html @@ -17,58 +17,54 @@Raad het woord van de dag. Elke gok geeft een hint over waar het woord zich in het alfabet bevindt.
Het woord van de dag komt na:
+Het woord van de dag komt na:
-Je huidige gok is:
#} - - -Het woord van vandaag was .
-- - -
🔗 alfagok.diginaut.net
-Het woord van vandaag was .
++ + +
🔗 alfagok.diginaut.net
Het woord van de dag komt voor:
-Het woord van de dag komt voor:
+