From f5b184fe54b8553d5e4f8c177a5a914d80ff7e8a Mon Sep 17 00:00:00 2001 From: nocci Date: Fri, 9 May 2025 14:34:33 +0200 Subject: [PATCH] seems to be the last RC - this app is done - so am I --- .env | 34 - README.md | 185 ++- app.py | 0 setup.sh | 150 ++- steam-gift-manager/.env | 41 + steam-gift-manager/Dockerfile | 30 +- steam-gift-manager/app.py | 1087 +++++++++++++---- steam-gift-manager/docker-compose.yml | 41 +- steam-gift-manager/entrypoint.sh | 16 + steam-gift-manager/requirements.txt | 4 + .../static/apple-touch-icon.png | Bin 0 -> 24079 bytes steam-gift-manager/static/favicon.ico | Bin 0 -> 15086 bytes steam-gift-manager/static/forgejo.webp | Bin 0 -> 740 bytes steam-gift-manager/static/gog_logo.webp | Bin 0 -> 6938 bytes steam-gift-manager/static/logo.webp | Bin 0 -> 8326 bytes steam-gift-manager/static/logo_small.webp | Bin 0 -> 6050 bytes .../static/logo_small_maskable.webp | Bin 0 -> 2568 bytes steam-gift-manager/static/manifest.json | 17 +- steam-gift-manager/static/serviceworker.js | 2 + steam-gift-manager/static/style.css | 35 + .../static/web-app-manifest-192x192.png | Bin 0 -> 25895 bytes .../static/web-app-manifest-512x512.png | Bin 0 -> 131482 bytes steam-gift-manager/templates/403.html | 25 + steam-gift-manager/templates/404.html | 25 + steam-gift-manager/templates/add_game.html | 135 +- .../templates/admin_audit_logs.html | 55 + steam-gift-manager/templates/admin_users.html | 39 + steam-gift-manager/templates/base.html | 95 +- steam-gift-manager/templates/edit_game.html | 186 ++- .../templates/game_details.html | 62 + steam-gift-manager/templates/index.html | 110 +- steam-gift-manager/templates/login.html | 18 +- steam-gift-manager/templates/redeem.html | 9 +- steam-gift-manager/translations/de.json | 95 +- steam-gift-manager/translations/en.json | 62 +- translate.sh | 33 +- upgrade.sh | 2 +- 37 files changed, 1932 insertions(+), 661 deletions(-) delete mode 100644 .env delete mode 100644 app.py create mode 100644 steam-gift-manager/.env create mode 100644 steam-gift-manager/entrypoint.sh create mode 100644 steam-gift-manager/static/apple-touch-icon.png create mode 100644 steam-gift-manager/static/favicon.ico create mode 100644 steam-gift-manager/static/forgejo.webp create mode 100644 steam-gift-manager/static/gog_logo.webp create mode 100644 steam-gift-manager/static/logo.webp create mode 100644 steam-gift-manager/static/logo_small.webp create mode 100644 steam-gift-manager/static/logo_small_maskable.webp create mode 100644 steam-gift-manager/static/web-app-manifest-192x192.png create mode 100644 steam-gift-manager/static/web-app-manifest-512x512.png create mode 100644 steam-gift-manager/templates/403.html create mode 100644 steam-gift-manager/templates/404.html create mode 100644 steam-gift-manager/templates/admin_audit_logs.html create mode 100644 steam-gift-manager/templates/admin_users.html create mode 100644 steam-gift-manager/templates/game_details.html diff --git a/.env b/.env deleted file mode 100644 index e8985d5..0000000 --- a/.env +++ /dev/null @@ -1,34 +0,0 @@ -# Flask-Configuration - Key are generated through setup.sh -SECRET_KEY="" -REDEEM_SECRET="" -WTF_CSRF_SECRET_KEY="" - -# locales -BABEL_DEFAULT_LOCALE="en" -BABEL_SUPPORTED_LOCALES="de,en" -BABEL_TRANSLATION_DIRECTORIES="translations" - -# Timezone -TZ=Europe/Berlin - -# Security -SESSION_COOKIE_SECURE="False" -CSRF_ENABLED="True" -# Account registration -REGISTRATION_ENABLED="True" - -# checking interval if keys have to be redeemed before a specific date -CHECK_EXPIRING_KEYS_INTERVAL_HOURS=6 - -# Pushover -PUSHOVER_APP_TOKEN="" -PUSHOVER_USER_KEY="" - -# Gotify -GOTIFY_URL="" -GOTIFY_TOKEN="" - -# Matrix -MATRIX_HOMESERVER="" -MATRIX_ACCESS_TOKEN="" -MATRIX_ROOM_ID="" diff --git a/README.md b/README.md index b25f09c..4eef38a 100644 --- a/README.md +++ b/README.md @@ -5,9 +5,7 @@ This project helps you keep track of your collected game keys. No more confusion about whether a key is redeemed, gifted, or still unused – now you have everything in one place, with search, status, and even automatic Steam cover images! -It's even possible to gift your keys via a unique website. Just edit the game to "Gifted" and you'll get a option to copy the on your overview page. (maybe HTTPS only) - -(the link will also remain in the edit area) +You can even gift your keys via a unique 24-hour website link – just mark a game as "Gifted" and copy the link from your overview. (HTTPS recommended) ![Screenshot](GameManager.png) @@ -16,70 +14,72 @@ It's even possible to gift your keys via a unique website. Just edit the game to ## ✨ Features ✨ - **Key Management:** - Enter your game keys, the corresponding game, platform, and maybe where you got the key. + Enter your game keys, platform, source, and more. - **Status Tracking:** - Mark keys as "Redeemed", "Gifted" or "Available" – always know your status. -- **Shop URL & Steam Cover:** - Save the shop URL and (optionally) the Steam AppID. The app will automatically show the official Steam cover image if available. -- **Gift your Games:** - You can create a unique redeem/gift website, which will expire after 24h. -- **Multi-user:** + Mark keys as "Redeemed", "Gifted", or "Available". +- **Steam Cover & Shop Info:** + Provide the Steam AppID and get the official game cover. Add shop URLs too. +- **Game Descriptions & Prices:** + Automatically fetch game descriptions, current best prices, and historical lows from [IsThereAnyDeal](https://isthereanydeal.com/) (API key required). +- **Gifting:** + Create a one-time gift link for each game that expires after 24 hours. +- **Search Functionality:** + Quickly find games with an integrated search bar. +- **Multi-user Support:** Each user manages their own keys. -- **Enable/Disable Registrations:** - Perfect if you want to run the Server just on your own (via .env file) -- **Search:** - Find games quickly with the search function. +- **User Roles:** + The first registered user becomes an admin automatically. +- **Admin Area:** + Admins can reset passwords, delete users, and view audit logs. +- **Audit Logs:** + Track user logins, password resets, and deleted accounts. +- **Registration Toggle:** + Enable or disable user registration via the `.env` file. - **Responsive UI:** - Works on desktop and mobile, with Dark Mode toggle. + Fully functional on desktop and mobile with Dark Mode support. - **Multi-language:** - Switch between English and German instantly*. -- **Import/Export (CSV / PDF -only export-):** - Easy export and import of your keys. (e.g. in case you have to start over) -- **Change Password:** - Change your Password on the fly. -- **Website Security:** - You can turn on/off CSRF and Secure Cookie via .env file. -- **Notifications:** - If you have key that have to be redeemed before a specific date. You can set up sending messages via, Pushover, Matrix and Gotify -- **No key data leaves your server!** -- **(Planned):** - - ~~Import/Export (CSV)~~ - - ~~Redeem site with unique sharing link~~ + Switch between English and German on the fly. +- **Import/Export (CSV, PDF export):** + Import/export your game keys easily. +- **Password Management:** + Users can change their passwords directly. +- **Notifications:** + Get alerts for expiring keys via Gotify, Matrix, or Pushover. +- **Security Settings:** + Toggle CSRF protection and secure cookies in `.env`. +- **Self-hosted:** + No data leaves your server. --- -## 🚀 Get Started! 🚀 +## 🚀 Get Started -## 1. **Clone the Repository (Option 1 or Option 2)** - -### Option 1: Clone the main repository +### 1. Clone the Repository ```bash git clone https://codeberg.org/nocci/GameKeyManager cd steam-gift-manager ``` -### Option 2: Clone from alternative repository (if option 1 fails) +Alternative: ```bash git clone https://git.nocci.it/nocci/GameKeyManager ``` -### 2. **Setup Docker** +### 2. Setup Docker -Make sure you have [Docker](https://www.docker.com/) and [docker-compose](https://docs.docker.com/compose/) installed. -If not, the script will ask you what to do and can install Docker and docker-compose for you. (maybe not if you are running Arch) +Make sure Docker and docker-compose are installed. +If not, the setup script can guide you (Arch-based distros may vary). -### 3. **Initial Setup** +### 3. Initial Setup ```bash chmod +x setup.sh ./setup.sh ``` -This script prepares all directories, configuration, and translation files. - -### 4. **Build and Start the App** +### 4. Build and Start the App ```bash cd steam-gift-manager/ @@ -87,102 +87,81 @@ docker-compose build --no-cache docker-compose up -d ``` -### 5. **Edit your .env file to your liking** +### 5. Configure `.env` File -It's in your root folder of the installation! +Adjust your settings: -```xml -# Security -SESSION_COOKIE_SECURE="True" (only works if you run this app via HTTPS) +```env +SESSION_COOKIE_SECURE="True" # Only works with HTTPS CSRF_ENABLED="True" +ITAD_API_KEY="your_api_key" # Optional, for price data ``` -**Important after any(!) change of the .env file!** +Apply changes after editing: ```bash -cd steam-gift-manager/ docker-compose down && docker-compose up -d --build ``` -### 6. **Initialize and Edit Translations (Optional)** +### 6. Translate (optional) ```bash ./translate.sh ``` -Edit the .po files in translations/de_DE/LC_MESSAGES/messages.po and en_US/LC_MESSAGES/messages.po +Edit the `.json` files in `translations/`, then restart: ```bash -./translate.sh -cd steam-gift-manager/ docker-compose down && docker-compose up -d --build ``` -### 7. **Open the App** +### 7. Access the App -Go to [http://localhost:5000](http://localhost:5000) in your browser. - -- Register your first user. -- Add your keys, shop URLs etc. -- Enjoy search, status, and automatic Steam cover images! +Visit [http://localhost:5000](http://localhost:5000) +Register the first user – this account becomes the admin! --- -## 🛠️ Technology Stack 🛠️ +## 🔔 Notifications (optinal) -- **Frontend:** Bootstrap 5, Jinja2 Templates ... -- **Backend:** Python 3, Flask, Flask-Babel, Flask-Login, Flask-SQLAlchemy, Apprise ... -- **Database:** SQLite (persisted in `data/`) -- **Containerization:** Docker, docker-compose -- **Translations:** Flask-Babel, editable `.po` files in `translations/` - -## 🌍 Multi-language - -- Switch between English and German using the dropdown in the navigation bar. -- All game and menu texts can be translated or individualized. - -## 🔔 Notifications - -- Send notifications if a game has to be redeemed by a specific date -- Switched from generic notifications to [Apprise](https://github.com/caronc/apprise) - have a look into the .env file -- 48 hours before you are running out of time the app will send you a notice to your services +- Reminders for expiring keys (48h notice) +- Pushover, Matrix, Gotify and more are supported through AppRise +- Configurable via `.env` --- -## 🪙 Do you this project? 🪙 +## 🛠️ Tech Stack -If you’d like to support itme, you can make a donation here: +- **Frontend:** Bootstrap 5, Jinja2, ... +- **Backend:** Python 3, Flask, Flask-SQLAlchemy, ... +- **Database:** SQLite +- **Container:** Docker, docker-compose -[![Ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/nocci) +--- +## 💬 Contribute + +Contributions are welcome: + +- Report bugs +- Suggest features +- Submit Pull Requests + +--- + +## 🪙 Support + +Like the project? You can support me: + +[![Ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/nocci) [![Liberapay](https://liberapay.com/assets/widgets/donate.svg)](https://liberapay.com/nocci/donate) -Thank you! +--- + +## 📜 License + +Licensed under [Apache License 2.0](LICENSE). --- -## 🙌 Contribute! 🙌 - -This project is open source! - -- **Bug Reports:** Please report bugs as Issues. -- **Feature Requests:** Suggest new features! -- **Pull Requests:** Submit your code changes! - -// **only possible after Forgejo opens for federation** \\\ - ---- - -## 📜 License 📜 - -This project is licensed under the [Apache License 2.0](LICENSE). - ---- - -## 💖 Acknowledgements 💖 - -A big thank you to everyone who supports and contributes to this project! - ---- - -**Enjoy your organized Game key collection!** 🚀 +**Enjoy managing your game collection!** \ No newline at end of file diff --git a/app.py b/app.py deleted file mode 100644 index e69de29..0000000 diff --git a/setup.sh b/setup.sh index be7212f..a44b53d 100644 --- a/setup.sh +++ b/setup.sh @@ -79,13 +79,28 @@ PROJECT_DIR="steam-gift-manager" TRANSLATIONS_DIR="$PWD/$PROJECT_DIR/translations" DATA_DIR="$PWD/data" -# 1. Create folders +# Create folders mkdir -p "$PROJECT_DIR" mkdir -p "$PROJECT_DIR"/{templates,static,translations} mkdir -p "$DATA_DIR" chmod -R a+rwX "$TRANSLATIONS_DIR" "$DATA_DIR" +echo -e "\n\033[1;32m✅ Downloading assets - Please wait!\033[0m" + +# Download Pictures from my server +cd "$PROJECT_DIR/static" +wget -O logo.webp "https://drop.nocadmin.net/logo.webp" > /dev/null 2>&1 +wget -O logo_small.webp "https://drop.nocadmin.net/logo_small.webp" > /dev/null 2>&1 +wget -O forgejo.webp "https://drop.nocadmin.net/forgejo.webp" > /dev/null 2>&1 +wget -O gog_logo.webp "https://drop.nocadmin.net/gog_logo.webp" > /dev/null 2>&1 +wget -O logo_small_maskable.webp "https://drop.nocadmin.net/logo_small_maskable.webp" > /dev/null 2>&1 +wget -O favicon.ico "https://drop.nocadmin.net/favicon.ico" > /dev/null 2>&1 +wget -O apple-touch-icon.png "https://drop.nocadmin.net/apple-touch-icon.png" > /dev/null 2>&1 +wget -O web-app-manifest-192x192.png "https://drop.nocadmin.net/web-app-manifest-192x192.png" > /dev/null 2>&1 +wget -O web-app-manifest-512x512.png "https://drop.nocadmin.net/web-app-manifest-512x512.png" > /dev/null 2>&1 +cd ../.. + cd $PROJECT_DIR # requirements.txt @@ -135,6 +150,7 @@ TZ=Europe/Berlin FORCE_HTTPS=False SESSION_COOKIE_SECURE=auto CSRF_ENABLED="True" + # Account registration REGISTRATION_ENABLED="True" @@ -158,7 +174,7 @@ REDIS_URL=redis://redis:6379/0 # Enable Debug (e.g. for VS Code) FLASK_DEBUG=1 -DEBUGPY=1 +DEBUGPY=0 EOL # app.py (the main app) @@ -167,19 +183,19 @@ cat <<'PYTHON_END' > app.py import atexit import csv import io -import locale # Note: locale was in your imports but not standard for typical web apps unless specific use. +import locale import logging import os import random import re import secrets -import sqlite3 # Note: direct sqlite3 import is unusual if you're using SQLAlchemy for all DB ops. +import sqlite3 import time import traceback from datetime import datetime, timedelta from functools import wraps -from io import BytesIO # Note: io.BytesIO is good, no need for direct BytesIO import if io is already imported. -from time import sleep # Note: time.sleep is fine, no need for direct 'sleep' import if 'time' is imported. +from io import BytesIO +from time import sleep from urllib.parse import urlparse from zoneinfo import ZoneInfo import warnings @@ -261,6 +277,11 @@ os.environ['TZ'] = TZ app = Flask(__name__) app.jinja_env.globals['getattr'] = getattr +@app.errorhandler(404) +def not_found_error(error): + return render_template('404.html'), 404 + + # UNIX-Systems (Linux, Docker) try: time.tzset() @@ -878,12 +899,12 @@ def edit_game(game_id): if request.method == 'POST': try: - # Validierung + # Validation if not request.form.get('name') or not request.form.get('steam_key'): flash(translate('Name and Steam Key are required'), 'error') return redirect(url_for('edit_game', game_id=game_id)) - # Dublettenprüfung + # Duplicate check existing = Game.query.filter( Game.steam_key == request.form['steam_key'], Game.id != game.id, @@ -893,7 +914,7 @@ def edit_game(game_id): flash(translate('Steam Key already exists'), 'error') return redirect(url_for('edit_game', game_id=game_id)) - # Felder aktualisieren + # Update fields game.name = request.form['name'] game.steam_key = request.form['steam_key'] game.status = request.form['status'] @@ -904,12 +925,12 @@ def edit_game(game_id): game.steam_appid = request.form.get('steam_appid', '') game.redeem_date = safe_parse_date(request.form.get('redeem_date', '')) - # Token-Logik + # Token-Logic if game.status == 'geschenkt': # Vorhandene Tokens löschen RedeemToken.query.filter_by(game_id=game.id).delete() - # Neuen Token generieren + # Generate new Token token = secrets.token_urlsafe(12)[:17] expires = datetime.now(local_tz) + timedelta(hours=24) new_token = RedeemToken( @@ -927,11 +948,11 @@ def edit_game(game_id): except IntegrityError as e: db.session.rollback() app.logger.error(f"IntegrityError: {traceback.format_exc()}") - flash(translate('Database error: {error}', error=str(e.orig)), 'error') # Platzhalter korrigiert + flash(translate('Database error: {error}', error=str(e.orig)), 'error') except Exception as e: db.session.rollback() app.logger.error(f"Unexpected error: {traceback.format_exc()}") - flash(translate('Unexpected error: {error}', error=str(e)), 'error') # Platzhalter korrigiert + flash(translate('Unexpected error: {error}', error=str(e)), 'error') return render_template( 'edit_game.html', @@ -1006,14 +1027,14 @@ def export_pdf(): elements = [] img_height = 2*cm - # Titel + # Title elements.append(Paragraph( translate("Game List (without Keys)", lang=session.get('lang', 'en')), styles['Title'] )) elements.append(Spacer(1, 12)) - # Tabellenkopf + # Table header col_widths = [ 5*cm, 10*cm, 6*cm, 3*cm ] @@ -1047,7 +1068,7 @@ def export_pdf(): game.redeem_date.strftime('%d.%m.%y') if game.redeem_date else '' ]) - # Table format (korrekte Einrückung) + # Table format table = Table(data, colWidths=col_widths, repeatRows=1) table.setStyle(TableStyle([ ('FONTNAME', (0,0), (-1,0), 'Helvetica-Bold'), @@ -1287,7 +1308,7 @@ def update_game_data(game_id): flash(translate('Steam-AppID missing, no Steam Data transferred'), 'warning') - # ITAD-Slug donings and such + # ITAD-Slug doings and such itad_slug = fetch_itad_slug(steam_appid) if itad_slug: game.itad_slug = itad_slug @@ -1422,7 +1443,7 @@ def cleanup_expired_tokens_job(): with app.app_context(): cleanup_expired_tokens() -# Jobs hinzufügen +# Add Jobs scheduler.add_job( check_expiring_keys_job, 'interval', @@ -1440,7 +1461,7 @@ def update_prices_job(): with app.app_context(): games = Game.query.filter(Game.steam_appid.isnot(None)).all() for game in games: - # Nur Preise aktualisieren + # just update prices itad_data = fetch_itad_data(f"app/{game.steam_appid}") if itad_data: game.current_price = itad_data.get('price_new') @@ -1488,7 +1509,7 @@ if __name__ == '__main__': PYTHON_END -# 9. Templates +# Templates - this was the "fun" part mkdir -p templates static # Base Template @@ -2037,16 +2058,16 @@ cat < templates/edit_game.html - +
- 🔄 {{ _('Externe Daten') }} + 🔄 {{ _('External Data') }}
{% if game.release_date %}
- {{ _('Veröffentlichung:') }} + {{ _('Release Date:') }} {{ game.release_date|strftime('%d.%m.%Y') }}
{% endif %} @@ -2079,7 +2100,7 @@ cat < templates/edit_game.html {% if game.status == 'geschenkt' %}
-
{{ _('Einlöse-Links') }}
+
{{ _('Redeem-Link') }}
{% for token in game.redeem_tokens if not token.is_expired() %}
@@ -2532,7 +2553,7 @@ cat < templates/admin_audit_logs.html HTML_END -# Error Site +# Error Sites cat < templates/403.html {% extends "base.html" %} {% block content %} @@ -2561,6 +2582,34 @@ cat < templates/403.html {% endblock %} HTML_END +cat < templates/404.html +{% extends "base.html" %} +{% block content %} +
+
+ Forbidden +

404

+

{{ _('Access Forbidden') }}

+

+ {{ _('Sorry, you are not allowed to access this page.') }} + ({{ _('Registration is currently disabled.') }}) +

+ + 🏠 {{ _('Back to Home') }} + +
+ + Sorry, you haven't unlocked this area yet. Grind some more XP or check your DLC entitlements.
Maybe try again after the next patch?
+
+
+
+
+{% endblock %} +HTML_END + # CSS cat < static/style.css :root { @@ -2774,7 +2823,7 @@ APP_DIR="steam-gift-manager" TRANSLATION_DIR="$APP_DIR/translations" LANGS=("de" "en") -# Prüfe jq +# check jq if ! command -v jq &>/dev/null; then echo "❌ jq is required. Install with: sudo apt-get install jq" exit 1 @@ -2810,12 +2859,12 @@ SCRIPT_END chmod +x ../translate.sh -# SOFORT AUSFÜHREN, um Basis-JSONs zu erstellen +# EXECUTE IMMEDIATELY to create basic JSONs cd .. ./translate.sh cd $PROJECT_DIR -# 5. Dockerfile +# Dockerfile cat <<'DOCKER_END' > Dockerfile FROM python:3.10-slim @@ -2824,12 +2873,6 @@ SHELL ["/bin/bash", "-c"] RUN apt-get update && apt-get install -y --no-install-recommends \ curl \ wget \ - && mkdir -p /app/static \ - && wget -O /app/static/logo.webp "https://drop.nocadmin.net/logo.webp" \ - && wget -O /app/static/logo_small.webp "https://drop.nocadmin.net/logo_small.webp" \ - && wget -O /app/static/forgejo.webp "https://drop.nocadmin.net/forgejo.webp" \ - && wget -O /app/static/gog_logo.webp "https://drop.nocadmin.net/gog_logo.webp" \ - && wget -O /app/static/logo_small_maskable.webp "https://drop.nocadmin.net/logo_small_maskable.webp" \ && rm -rf /var/lib/apt/lists/* RUN apt-get update && apt-get install -y locales && \ @@ -2896,6 +2939,7 @@ services: volumes: - ../data:/app/data - ./translations:/app/translations:rw + - ./static:/app/static:rw user: "${UID:-1000}:${GID:-1000}" restart: unless-stopped command: ["/app/entrypoint.sh"] @@ -2924,7 +2968,7 @@ set -e # Set the working directory to the project directory cd "$(dirname "$0")/steam-gift-manager" -# Setze FLASK_APP, falls nötig +# set FLASK_APP, if needed export FLASK_APP=app.py # Initialize migrations, if not yet available @@ -2960,28 +3004,30 @@ cat < static/manifest.json }, "icons": [ { - "src": "/static/logo_small.webp", + "src": "/static/web-app-manifest-192x192.png", "sizes": "192x192", "type": "image/webp", "purpose": "any" }, { - "src": "/static/logo_small_maskable.webp", + "src": "/static/web-app-manifest-192x192.png", "sizes": "192x192", - "type": "image/webp", + "type": "image/png", "purpose": "maskable" }, { - "src": "/static/logo.webp", + "src": "/static/web-app-manifest-512x512.png", "sizes": "512x512", - "type": "image/webp", - "purpose": "any maskable" + "type": "image/png", + "purpose": "maskable" } - ] + ], + "theme_color": "#ffffff", + "background_color": "#3f3a3a", + "display": "standalone" } MANIFEST_END - # Service Worker cat < static/serviceworker.js const CACHE_NAME = 'game-key-manager-v2'; @@ -2989,6 +3035,8 @@ const ASSETS = [ '/', '/static/style.css', '/static/logo.webp', + '/static/web-app-manifest-512x512.png', + '/static/web-app-manifest-192x192.png', '/static/logo_small.webp', '/static/gog_logo.webp', '/static/forgejo.webp' @@ -3018,6 +3066,22 @@ self.addEventListener('activate', (event) => { }); SW_END +# Download German Translation from my server +cd "$TRANSLATIONS_DIR" + +read -p "Do you want to download German translations from the dev-server (could cause trouble, but normally it is safe)? [y/N]: " download_de +if [[ "$download_de" =~ ^[YyJj]$ ]]; then + wget -O de.json "https://drop.nocadmin.net/de.json" > /dev/null 2>&1 + if [ $? -eq 0 ]; then + echo "✅ German translations downloaded successfully." + else + echo "❌ Download failed. Keeping existing de.json." + fi +else + echo "⏩ Skipped downloading German translations." +fi + + echo -e "\n\033[1;32m✅ Setup done! Seems to be okay!\033[0m" echo -e "Have a look in your .env" echo -e "nano .env" diff --git a/steam-gift-manager/.env b/steam-gift-manager/.env new file mode 100644 index 0000000..70fc37e --- /dev/null +++ b/steam-gift-manager/.env @@ -0,0 +1,41 @@ +# Flask-Configuration +SECRET_KEY="ef16ed848264df8391a7f9769f0ac13d5d4c1a711793bb6b" +REDEEM_SECRET="02c6a04e663604a837141d79e75b0a93" +WTF_CSRF_SECRET_KEY="5c6c0f730c337afb804ba21c6e1b3f93" + +# Language Settings +DEFAULT_LANGUAGE="en" +SUPPORTED_LANGUAGES="de,en" + +# Timezone +TZ=Europe/Berlin + +# Security +FORCE_HTTPS=False +SESSION_COOKIE_SECURE=auto +CSRF_ENABLED="True" + +# Account registration +REGISTRATION_ENABLED="True" + +# checking interval if keys have to be redeemed before a specific date +CHECK_EXPIRING_KEYS_INTERVAL_HOURS=6 + +# Want to check prices? Here you are! +ITAD_API_KEY="your-secret-key-here" +ITAD_COUNTRY="DE" + +# Apprise URLs (separate several with a comma or space) +APPRISE_URLS="" + +### example for multiple notifications +#APPRISE_URLS="pover://USER_KEY@APP_TOKEN +#gotify://gotify.example.com/TOKEN +#matrixs://TOKEN@matrix.org/!ROOM_ID" + +# Redis URL +REDIS_URL=redis://redis:6379/0 + +# Enable Debug (e.g. for VS Code) +FLASK_DEBUG=1 +DEBUGPY=0 diff --git a/steam-gift-manager/Dockerfile b/steam-gift-manager/Dockerfile index ee654d4..496be18 100644 --- a/steam-gift-manager/Dockerfile +++ b/steam-gift-manager/Dockerfile @@ -2,13 +2,25 @@ FROM python:3.10-slim SHELL ["/bin/bash", "-c"] -RUN apt-get update && apt-get install -y --no-install-recommends wget && mkdir -p /app/static && wget -O /app/static/logo.webp "https://drop.nocadmin.net/logo.webp" && wget -O /app/static/logo_small.webp "https://drop.nocadmin.net/logo_small.webp" && wget -O /app/static/forgejo.webp "https://drop.nocadmin.net/forgejo.webp" && wget -O /app/static/gog_logo.webp "https://drop.nocadmin.net/gog_logo.webp" && wget -O /app/static/logo_small_maskable.webp "https://drop.nocadmin.net/logo_small_maskable.webp" && rm -rf /var/lib/apt/lists/* +RUN apt-get update && apt-get install -y --no-install-recommends \ + curl \ + wget \ + && rm -rf /var/lib/apt/lists/* -RUN mkdir -p /app/data && chown -R 1000:1000 /app/data +RUN apt-get update && apt-get install -y locales && \ + sed -i '/de_DE.UTF-8/s/^# //' /etc/locale.gen && \ + locale-gen +ENV LC_ALL=de_DE.UTF-8 LANG=de_DE.UTF-8 -ENV TZ= -RUN ln -snf /usr/share/zoneinfo/ /etc/localtime && echo > /etc/timezone +RUN mkdir -p /app/data && \ + chown -R 1000:1000 /app/data + +ENV TZ=${TZ} +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone + +COPY entrypoint.sh /app/entrypoint.sh +RUN chmod +x /app/entrypoint.sh WORKDIR /app COPY requirements.txt . @@ -18,10 +30,14 @@ COPY . . ARG UID=1000 ARG GID=1000 -RUN groupadd -g $GID appuser && useradd -u $UID -g $GID -m appuser && chown -R appuser:appuser /app + +RUN groupadd -g ${GID} appuser && \ + useradd -l -o -u ${UID} -g appuser -m appuser && \ + mkdir -p /app && \ + chown -R appuser:appuser /app USER appuser -EXPOSE 5000 +EXPOSE 5000 5678 +ENTRYPOINT ["/app/entrypoint.sh"] -CMD ["gunicorn", "-b", "0.0.0.0:5000", "app:app"] diff --git a/steam-gift-manager/app.py b/steam-gift-manager/app.py index 64cf1a7..3dbe756 100644 --- a/steam-gift-manager/app.py +++ b/steam-gift-manager/app.py @@ -1,54 +1,119 @@ -import os -import warnings -from sqlalchemy.exc import LegacyAPIWarning -warnings.simplefilter("ignore", category=LegacyAPIWarning) -from flask import Flask, render_template, request, redirect, url_for, flash, make_response, session, abort, send_file, jsonify -from flask_sqlalchemy import SQLAlchemy -from flask_login import LoginManager, UserMixin, login_user, logout_user, login_required, current_user -from werkzeug.security import generate_password_hash, check_password_hash -from datetime import datetime, timedelta -from flask_wtf import CSRFProtect -from flask import abort -from flask import request, redirect -import io -import warnings -import re -import io -import csv -import secrets -import requests -from dotenv import load_dotenv -load_dotenv(override=True) -from sqlalchemy.exc import IntegrityError -from apscheduler.schedulers.background import BackgroundScheduler +# Standard library imports import atexit -from flask_migrate import Migrate -from sqlalchemy import MetaData -from reportlab.pdfgen import canvas -from reportlab.lib.pagesizes import A4, landscape, letter -from reportlab.platypus import ( - SimpleDocTemplate, - Table, - TableStyle, - Paragraph, - Image, - Spacer -) -from reportlab.lib import colors -from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle -from reportlab.lib.utils import ImageReader -from reportlab.lib.units import cm, inch, mm -from io import BytesIO -import reportlab.lib +import csv +import io +import locale import logging -logging.basicConfig() +import os +import random +import re +import secrets +import sqlite3 +import time +import traceback +from datetime import datetime, timedelta +from functools import wraps +from io import BytesIO +from time import sleep +from urllib.parse import urlparse +from zoneinfo import ZoneInfo +import warnings + +# 3rd-Provider-Modules +import pytz +import requests +from apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStore +from apscheduler.schedulers.background import BackgroundScheduler +from dotenv import load_dotenv +from flask import ( + Flask, + Markup, + abort, + flash, + g, + jsonify, + make_response, + redirect, + render_template, + request, + send_file, + session, + url_for +) +from flask_login import ( + LoginManager, + UserMixin, + current_user, + login_required, + login_user, + logout_user +) +from flask_migrate import Migrate +from flask_session import Session +from flask_sqlalchemy import SQLAlchemy +from flask_wtf import CSRFProtect, FlaskForm +from redis import Redis +from reportlab.lib import colors +from reportlab.lib.pagesizes import A4, landscape, letter +from reportlab.lib.styles import ParagraphStyle, getSampleStyleSheet +from reportlab.lib.units import cm, inch, mm +from reportlab.lib.utils import ImageReader +from reportlab.pdfgen import canvas +from reportlab.platypus import ( + Image, + Paragraph, + SimpleDocTemplate, + Spacer, + Table, + TableStyle +) +from sqlalchemy import MetaData, UniqueConstraint, event +from sqlalchemy.engine import Engine +from sqlalchemy.exc import IntegrityError, LegacyAPIWarning +from sqlalchemy.orm import joinedload +from werkzeug.security import check_password_hash, generate_password_hash +from wtforms import SelectField, StringField, TextAreaField, validators + +# Config +load_dotenv(override=True) +warnings.simplefilter("ignore", category=LegacyAPIWarning) + +# Logging-Config +logging.basicConfig(level=logging.INFO) +logging.getLogger('apscheduler').setLevel(logging.WARNING) + + +@event.listens_for(Engine, "connect") +def enable_foreign_keys(dbapi_connection, connection_record): + if isinstance(dbapi_connection, sqlite3.Connection): + cursor = dbapi_connection.cursor() + cursor.execute("PRAGMA foreign_keys=ON;") + cursor.close() + +ITAD_API_KEY_PLACEHOLDER = "your_api_key_here" +TZ = os.getenv('TZ', 'UTC') +os.environ['TZ'] = TZ app = Flask(__name__) +app.jinja_env.globals['getattr'] = getattr + +@app.errorhandler(404) +def not_found_error(error): + return render_template('404.html'), 404 + + +# UNIX-Systems (Linux, Docker) +try: + time.tzset() +except AttributeError: + pass # tzset not availabe on Windows +local_tz = pytz.timezone(TZ) # Load Languages import os import json -TRANSLATION_DIR = os.path.join(os.path.dirname(__file__), 'translations') + +TRANSLATION_DIR = os.path.join(os.getcwd(), 'translations') SUPPORTED_LANGUAGES = ['de', 'en'] TRANSLATIONS = {} @@ -56,23 +121,37 @@ for lang in SUPPORTED_LANGUAGES: try: with open(os.path.join(TRANSLATION_DIR, f'{lang}.json'), encoding='utf-8') as f: TRANSLATIONS[lang] = json.load(f) + print(f"✅ Loaded {lang} translations") except Exception: + print(f"❌ Failed loading {lang}.json: {str(e)}") TRANSLATIONS[lang] = {} def translate(key, lang=None, **kwargs): - if not lang: - lang = session.get('lang', 'en') - value = TRANSLATIONS.get(lang, {}).get(key) - if value is None and lang != 'en': - value = TRANSLATIONS.get('en', {}).get(key, key) - else: - value = value or key - return value.format(**kwargs) if kwargs and isinstance(value, str) else value + lang = lang or session.get('lang', 'en') + fallback_lang = app.config.get('DEFAULT_LANGUAGE', 'en') + + translations = TRANSLATIONS.get(lang, {}) + fallback_translations = TRANSLATIONS.get(fallback_lang, {}) + + value = translations.get(key) or fallback_translations.get(key) or key + return value.format(**kwargs) if isinstance(value, str) else value ## DEBUG Translations if app.debug: print(f"Loaded translations for 'de': {TRANSLATIONS.get('de', {})}") +### Admin decorator +def admin_required(f): + @wraps(f) + def decorated_function(*args, **kwargs): + if not current_user.is_authenticated: + abort(403) + if not current_user.is_admin: + abort(403) + return f(*args, **kwargs) + return decorated_function + + csrf = CSRFProtect(app) convention = { @@ -86,27 +165,55 @@ convention = { metadata = MetaData(naming_convention=convention) load_dotenv(override=True) -# Lade Umgebungsvariablen aus .env mit override +# load variables from .env with override load_dotenv(override=True) # App-Configuration app.config.update( + # Most Important SECRET_KEY=os.getenv('SECRET_KEY'), - SQLALCHEMY_DATABASE_URI='sqlite:////app/data/games.db', - SQLALCHEMY_TRACK_MODIFICATIONS=False, - SESSION_COOKIE_SECURE=os.getenv('SESSION_COOKIE_SECURE', 'False') == 'True', - SESSION_COOKIE_SAMESITE='Lax', - PERMANENT_SESSION_LIFETIME=timedelta(days=30), - SESSION_REFRESH_EACH_REQUEST=False, - WTF_CSRF_ENABLED=os.getenv('CSRF_ENABLED', 'True') == 'True', - REGISTRATION_ENABLED=os.getenv('REGISTRATION_ENABLED', 'True').lower() == 'true', - SEND_FILE_MAX_AGE_DEFAULT=int(os.getenv('SEND_FILE_MAX_AGE_DEFAULT', 0)), - TEMPLATES_AUTO_RELOAD=os.getenv('TEMPLATES_AUTO_RELOAD', 'True') == 'True' + SQLALCHEMY_DATABASE_URI = 'sqlite:////app/data/games.db', + SQLALCHEMY_TRACK_MODIFICATIONS = False, + DEFAULT_LANGUAGE='en', + ITAD_COUNTRY = os.getenv("ITAD_COUNTRY", "DE"), + + # SESSION-HANDLING (In Production: Use Redis!) + SESSION_TYPE='redis', + SESSION_PERMANENT = False, + SESSION_USE_SIGNER = True, + SESSION_REDIS=Redis.from_url(os.getenv("REDIS_URL", "redis://redis:6379/0")), + SESSION_FILE_DIR = '/app/data/flask-sessions', + SESSION_COOKIE_NAME = 'gamekeys_session', + SESSION_COOKIE_SECURE = os.getenv('SESSION_COOKIE_SECURE', 'False').lower() == 'true', + SESSION_COOKIE_HTTPONLY = True, + SESSION_COOKIE_SAMESITE = 'Lax', + PERMANENT_SESSION_LIFETIME = timedelta(days=30), + + + # LOGIN COOKIE STUFF + REMEMBER_COOKIE_DURATION=timedelta(days=30), + REMEMBER_COOKIE_HTTPONLY=True, + REMEMBER_COOKIE_SECURE=True if os.getenv('FORCE_HTTPS', 'False').lower() == 'true' else False, + REMEMBER_COOKIE_SAMESITE='Lax', + + # CSRF-PROTECTION + WTF_CSRF_ENABLED = True, + WTF_CSRF_SECRET_KEY = os.getenv('CSRF_SECRET_KEY', os.urandom(32).hex()), + WTF_CSRF_TIME_LIMIT = 3600, + + # SECURITYsa & PERFORMANCE + REGISTRATION_ENABLED = os.getenv('REGISTRATION_ENABLED', 'True').lower() == 'true', + SEND_FILE_MAX_AGE_DEFAULT = int(os.getenv('SEND_FILE_MAX_AGE_DEFAULT', 0)), + TEMPLATES_AUTO_RELOAD = os.getenv('TEMPLATES_AUTO_RELOAD', 'True').lower() == 'true', + PREFERRED_URL_SCHEME = 'https' if os.getenv('FORCE_HTTPS') else 'http' ) + +Session(app) + interval_hours = int(os.getenv('CHECK_EXPIRING_KEYS_INTERVAL_HOURS', 12)) -# Initialisation +# Init db = SQLAlchemy(app, metadata=metadata) migrate = Migrate(app, db) login_manager = LoginManager(app) @@ -114,55 +221,175 @@ login_manager.login_view = 'login' # Logging app.logger.addHandler(logging.StreamHandler()) -app.logger.setLevel(logging.INFO) +app.logger.setLevel(logging.DEBUG) + +@app.errorhandler(403) +def forbidden_error(error): + return render_template('403.html'), 403 @app.before_request +def set_language(): + if 'lang' not in session or not session['lang']: + session['lang'] = app.config.get('DEFAULT_LANGUAGE', 'en') + g.lang = session['lang'] + def enforce_https(): - if os.getenv('FORCE_HTTPS', 'False').lower() == 'true': - if request.headers.get('X-Forwarded-Proto', 'http') != 'https' and not request.is_secure: + if os.getenv('FORCE_HTTPS', 'False').lower() == 'true' and not app.debug: + proto = request.headers.get('X-Forwarded-Proto', 'http') + if proto != 'https' and not request.is_secure: url = request.url.replace('http://', 'https://', 1) - app.logger.info(f"Redirecting to HTTPS: {url}") return redirect(url, code=301) +def debug_translations(): + if app.debug: + app.logger.debug(f"Lang: {session.get('lang')}") + +app.before_request(enforce_https) + + @app.context_processor -def inject_template_vars(): - def _(key, **kwargs): - lang = session.get('lang', 'en') - return translate(key, lang, **kwargs) - theme = request.cookies.get('theme', 'light') - return dict(_=_, theme=theme) +def inject_template_globals(): + return { + '_': lambda key, **kwargs: translate(key, lang=session.get('lang', 'en'), **kwargs), + 'now': datetime.now(local_tz), + 'app_version': os.getenv('APP_VERSION', '1.0.0'), + 'local_tz': local_tz + } + +@app.template_filter('strftime') +def _jinja2_filter_datetime(date, fmt='%d.%m.%Y'): + if date is None: + return '' + return date.strftime(fmt) + +@app.errorhandler(403) +def forbidden(e): + return render_template('403.html'), 403 + # DB Models -class User(db.Model, UserMixin): +class ActivityLog(db.Model): + __tablename__ = 'activity_logs' + + id = db.Column(db.Integer, primary_key=True) + user_id = db.Column(db.Integer, db.ForeignKey('users.id')) + action = db.Column(db.String(100), nullable=False) + details = db.Column(db.Text) + timestamp = db.Column(db.DateTime, default=lambda: datetime.now(local_tz)) + + user = db.relationship('User', backref='activities') + + +class User(UserMixin, db.Model): __tablename__ = 'users' + id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(80), unique=True, nullable=False) password = db.Column(db.String(256), nullable=False) - games = db.relationship('Game', back_populates='owner', lazy=True) + is_admin = db.Column(db.Boolean, default=False) + games = db.relationship( + 'Game', + back_populates='owner', + cascade='all, delete-orphan', + passive_deletes=True + ) + class Game(db.Model): + __tablename__ = 'games' + __table_args__ = ( + UniqueConstraint('steam_key', 'user_id', name='uq_steam_key_user'), + ) + id = db.Column(db.Integer, primary_key=True) - owner = db.relationship('User', back_populates='games') name = db.Column(db.String(100), nullable=False) steam_key = db.Column(db.String(100), nullable=False, unique=True) status = db.Column(db.String(50), nullable=False) recipient = db.Column(db.String(100)) notes = db.Column(db.Text) url = db.Column(db.String(200)) - created_at = db.Column(db.DateTime, default=datetime.utcnow) + created_at = db.Column(db.DateTime, default=lambda: datetime.now(local_tz)) redeem_date = db.Column(db.DateTime) - user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False) steam_appid = db.Column(db.String(20)) + platform = db.Column(db.String(50), default='pc') + current_price = db.Column(db.Float) + current_price_shop = db.Column(db.String(100)) + historical_low = db.Column(db.Float) + release_date = db.Column(db.DateTime) + release_date = db.Column(db.DateTime) + itad_slug = db.Column(db.String(200)) + steam_description_en = db.Column(db.Text) + steam_description_de = db.Column(db.Text) + + # with users.id + user_id = db.Column(db.Integer, db.ForeignKey('users.id', ondelete='CASCADE'), nullable=False) + + owner = db.relationship( + 'User', + back_populates='games' + ) + + redeem_tokens = db.relationship( + 'RedeemToken', + back_populates='game', + cascade='all, delete-orphan', + passive_deletes=True + ) class RedeemToken(db.Model): + __tablename__ = 'redeem_tokens' + id = db.Column(db.Integer, primary_key=True) token = db.Column(db.String(17), unique=True, nullable=False) - game_id = db.Column(db.Integer, db.ForeignKey('game.id'), nullable=False) - expires = db.Column(db.DateTime, nullable=False) - used = db.Column(db.Boolean, default=False) + expires = db.Column(db.DateTime(timezone=True), nullable=False) total_hours = db.Column(db.Integer, nullable=False) + + # ForeignKey with CASCADE + game_id = db.Column( + db.Integer, + db.ForeignKey('games.id', ondelete='CASCADE'), + nullable=False + ) + + game = db.relationship('Game', back_populates='redeem_tokens') + + def is_expired(self): + # use timeszone (from .env) + local_tz = pytz.timezone(os.getenv('TZ', 'UTC')) + now = datetime.now(local_tz) + return now > self.expires.astimezone(local_tz) + +class GameForm(FlaskForm): + name = StringField('Name', [validators.DataRequired()]) + steam_key = StringField('Steam Key') + status = SelectField('Status', choices=[ + ('nicht eingelöst', 'Nicht eingelöst'), + ('eingelöst', 'Eingelöst'), + ('geschenkt', 'Geschenkt') + ]) + recipient = StringField('Empfänger') + notes = TextAreaField('Notizen') + url = StringField('Store URL') + redeem_date = StringField('Einlösedatum') + steam_appid = StringField('Steam App ID') + +PLATFORM_CHOICES = [ + ('steam', 'Steam'), + ('gog', 'GOG'), + ('xbox', 'XBox'), + ('playstation', 'PlayStation'), + ('switch', 'Nintendo Switch'), + ('other', 'Other'), + ('pc', 'PC') +] + +STATUS_CHOICES = [ + ('nicht eingelöst', 'Nicht eingelöst'), + ('eingelöst', 'Eingelöst'), + ('geschenkt', 'Geschenkt') +] with app.app_context(): db.create_all() @@ -182,6 +409,131 @@ def get_or_404(model, id): abort(404) return instance +# Admin Audit Helper +def log_activity(user_id, action, details=None): + """ + Store an activity log entry for auditing purposes. + """ + log = ActivityLog( + user_id=user_id, + action=action, + details=details + ) + db.session.add(log) + db.session.commit() + +# Game Infos Helper +def fetch_steam_data(appid, lang='en'): + lang_map = { + 'en': 'english', + 'de': 'german' + } + steam_lang = lang_map.get(lang, 'english') + try: + response = requests.get( + "https://store.steampowered.com/api/appdetails", + params={"appids": appid, "l": steam_lang}, + timeout=15 + ) + data = response.json().get(str(appid), {}) + if data.get("success"): + return { + "name": data["data"].get("name"), + "detailed_description": data["data"].get("detailed_description"), + "release_date": data["data"].get("release_date", {}).get("date"), + } + except Exception as e: + app.logger.error(f"Steam API error: {str(e)}") + return None + +def parse_steam_release_date(date_str): + """Parsing Steam-Release-Date (the german us thingy, you know)""" + import locale + from datetime import datetime + + # try german format + try: + locale.setlocale(locale.LC_TIME, "de_DE.UTF-8") + return datetime.strptime(date_str, "%d. %b. %Y") + except Exception: + pass + # Fallback: okay lets try the english one + try: + locale.setlocale(locale.LC_TIME, "en_US.UTF-8") + return datetime.strptime(date_str, "%d %b, %Y") + except Exception: + pass + return None + +def fetch_itad_slug(steam_appid: int) -> str | None: + api_key = os.getenv("ITAD_API_KEY") + if not api_key or api_key.strip() == "your-secret-key-here": + app.logger.warning("ITAD-API-Key ist nicht gesetzt oder ist ein Platzhalter.") + return None + try: + response = requests.get( + "https://api.isthereanydeal.com/games/lookup/v1", + params={"key": api_key, "appid": steam_appid, "platform": "steam"}, + timeout=10 + ) + data = response.json() + return data.get("game", {}).get("slug") + except Exception as e: + app.logger.error(f"ITAD Error: {str(e)}") + return None + + +def fetch_itad_game_id(steam_appid: int) -> str | None: + api_key = os.getenv("ITAD_API_KEY") + if not api_key or api_key.strip() == "your-secret-key-here": + app.logger.warning("ITAD-API-Key ist nicht gesetzt oder ist ein Platzhalter.") + return None + + try: + response = requests.get( + "https://api.isthereanydeal.com/games/lookup/v1", + params={"key": api_key, "appid": steam_appid, "platform": "steam"}, + timeout=10 + ) + response.raise_for_status() + data = response.json() + if data.get("found") and data.get("game") and data["game"].get("id"): + return data["game"]["id"] + app.logger.error(f"ITAD Response Error: {data}") + return None + except Exception as e: + app.logger.error(f"ITAD Error: {str(e)}") + return None + +def fetch_itad_prices(game_id: str) -> dict | None: + api_key = os.getenv("ITAD_API_KEY") + country = os.getenv("ITAD_COUNTRY", "DE") + + if not api_key or api_key.strip() == "your-secret-key-here": + app.logger.warning("ITAD-API-Key ist nicht gesetzt oder ist ein Platzhalter.") + return None + + try: + response = requests.post( + "https://api.isthereanydeal.com/games/prices/v3", + params={ + "key": api_key, + "country": country, + "shops": "steam", + "vouchers": "false" + }, + json=[game_id], + headers={"Content-Type": "application/json"}, + timeout=15 + ) + response.raise_for_status() + return response.json()[0] + + except Exception as e: + app.logger.error(f"ITAD-Preisabfrage fehlgeschlagen: {str(e)}") + return None + + @app.route('/') @login_required def index(): @@ -201,49 +553,74 @@ def index(): def set_lang(lang): if lang in SUPPORTED_LANGUAGES: session['lang'] = lang + session.permanent = True return redirect(request.referrer or url_for('index')) @app.route('/set-theme/') def set_theme(theme): resp = make_response('', 204) - # Von 'dark_mode' zu 'theme' ändern resp.set_cookie('theme', theme, max_age=60*60*24*365) return resp @app.route('/login', methods=['GET', 'POST']) def login(): + if current_user.is_authenticated: # Prevent already logged-in users from accessing login page + return redirect(url_for('index')) + if request.method == 'POST': - username = request.form['username'] - password = request.form['password'] + username = request.form.get('username') + password = request.form.get('password') + remember = request.form.get('remember_me') == 'true' + user = User.query.filter_by(username=username).first() - + if user and check_password_hash(user.password, password): - login_user(user) - return redirect(url_for('index')) - - flash(_('Invalid credentials'), 'danger') + # Pass remember=True to login_user and set duration + # The duration will be taken from app.config['REMEMBER_COOKIE_DURATION'] + login_user(user, remember=remember) + + # Log activity + log_activity(user.id, 'user_login', f"User '{user.username}' logged in.") + + next_page = request.args.get('next') + # Add security check for next_page to prevent open redirect + if not next_page or urlparse(next_page).netloc != '': + next_page = url_for('index') + flash(translate('Logged in successfully.'), 'success') + return redirect(next_page) + else: + flash(translate('Invalid username or password.'), 'danger') return render_template('login.html') @app.route('/register', methods=['GET', 'POST']) def register(): if not app.config['REGISTRATION_ENABLED']: - flash(_('No new registrations. They are deactivated!'), 'danger') - return redirect(url_for('login')) - + abort(403) + if request.method == 'POST': username = request.form['username'] - password = generate_password_hash(request.form['password']) - - if User.query.filter_by(username=username).first(): - flash(_('Username already exists'), 'danger') + password = request.form['password'] + + existing_user = User.query.filter_by(username=username).first() + if existing_user: + flash(translate('Username already exists'), 'error') return redirect(url_for('register')) - - new_user = User(username=username, password=password) + + # make the first user admin + is_admin = User.query.count() == 0 + + new_user = User( + username=username, + password=generate_password_hash(password), + is_admin=is_admin + ) + db.session.add(new_user) db.session.commit() login_user(new_user) + flash(translate('Registration successful'), 'success') return redirect(url_for('index')) - + return render_template('register.html') @app.route('/logout') @@ -261,16 +638,16 @@ def change_password(): confirm_password = request.form['confirm_password'] if not check_password_hash(current_user.password, current_password): - flash(_('Current passwort is wrong'), 'danger') + flash(translate('Current passwort is wrong'), 'danger') return redirect(url_for('change_password')) if new_password != confirm_password: - flash(_('New Passwords are not matching'), 'danger') + flash(translate('New Passwords are not matching'), 'danger') return redirect(url_for('change_password')) current_user.password = generate_password_hash(new_password) db.session.commit() - flash(_('Password changed successfully'), 'success') + flash(translate('Password changed successfully', session.get('lang', 'en')), 'success') return redirect(url_for('index')) return render_template('change_password.html') @@ -285,10 +662,15 @@ def add_game(): if not steam_appid: steam_appid = extract_steam_appid(url) - + + steam_key = request.form['steam_key'] + if Game.query.filter_by(steam_key=steam_key).first(): + flash(translate('Steam Key already exists!'), 'error') + return redirect(url_for('add_game')) + new_game = Game( name=request.form['name'], - steam_key=request.form['steam_key'], + steam_key=steam_key, status=request.form['status'], recipient=request.form.get('recipient', ''), notes=request.form.get('notes', ''), @@ -300,83 +682,113 @@ def add_game(): db.session.add(new_game) db.session.commit() - flash(_('Game added successfully!'), 'success') + flash(translate('Game added successfully!'), 'success') return redirect(url_for('index')) - except IntegrityError: + except IntegrityError as e: db.session.rollback() - flash(_('Steam Key already exists!'), 'danger') + if "UNIQUE constraint failed: game.steam_key" in str(e): + flash(translate('Steam Key already exists!'), 'error') + else: + flash(translate('Database error: %(error)s', error=str(e)), 'error') + except Exception as e: db.session.rollback() - flash(_('Error: ') + str(e), 'danger') + flash(translate('Error: %(error)s', error=str(e)), 'error') - return render_template('add_game.html') + return render_template( + 'add_game.html', + platforms=PLATFORM_CHOICES, + statuses=STATUS_CHOICES + ) + @app.route('/edit/', methods=['GET', 'POST']) @login_required def edit_game(game_id): - game = db.session.get(Game, game_id) - if not game or game.owner != current_user: - abort(404) - - if not game or game.owner != current_user: - abort(403) - - active_redeem = RedeemToken.query.filter( - RedeemToken.game_id == game_id, - RedeemToken.expires > datetime.utcnow() - ).first() - - redeem_url = url_for('redeem_page', token=active_redeem.token, _external=True) if active_redeem else None + # Eager Loading für Tokens + game = Game.query.options(joinedload(Game.redeem_tokens)).get_or_404(game_id) + + def safe_parse_date(date_str): + try: + naive = datetime.strptime(date_str, '%Y-%m-%d') if date_str else None + return local_tz.localize(naive) if naive else None + except ValueError: + return None if request.method == 'POST': try: - url = request.form.get('url', '') - steam_appid = request.form.get('steam_appid', '').strip() - - if not steam_appid: - steam_appid = extract_steam_appid(url) - + # Validation + if not request.form.get('name') or not request.form.get('steam_key'): + flash(translate('Name and Steam Key are required'), 'error') + return redirect(url_for('edit_game', game_id=game_id)) + + # Duplicate check + existing = Game.query.filter( + Game.steam_key == request.form['steam_key'], + Game.id != game.id, + Game.user_id == current_user.id + ).first() + if existing: + flash(translate('Steam Key already exists'), 'error') + return redirect(url_for('edit_game', game_id=game_id)) + + # Update fields game.name = request.form['name'] game.steam_key = request.form['steam_key'] game.status = request.form['status'] + game.platform = request.form.get('platform', 'pc') game.recipient = request.form.get('recipient', '') game.notes = request.form.get('notes', '') - game.url = url - game.steam_appid = steam_appid - game.redeem_date = datetime.strptime(request.form['redeem_date'], '%Y-%m-%d') if request.form['redeem_date'] else None + game.url = request.form.get('url', '') + game.steam_appid = request.form.get('steam_appid', '') + game.redeem_date = safe_parse_date(request.form.get('redeem_date', '')) + # Token-Logic + if game.status == 'geschenkt': + # Vorhandene Tokens löschen + RedeemToken.query.filter_by(game_id=game.id).delete() + + # Generate new Token + token = secrets.token_urlsafe(12)[:17] + expires = datetime.now(local_tz) + timedelta(hours=24) + new_token = RedeemToken( + token=token, + game_id=game.id, + expires=expires, + total_hours=24 + ) + db.session.add(new_token) + db.session.commit() - flash(_('Changes saved!'), 'success') + flash(translate('Changes saved successfully'), 'success') return redirect(url_for('index')) - + + except IntegrityError as e: + db.session.rollback() + app.logger.error(f"IntegrityError: {traceback.format_exc()}") + flash(translate('Database error: {error}', error=str(e.orig)), 'error') except Exception as e: db.session.rollback() - flash(_('Error: ') + str(e), 'danger') - - return render_template('edit_game.html', - game=game, - redeem_url=redeem_url, - active_redeem=active_redeem, - redeem_date=game.redeem_date.strftime('%Y-%m-%d') if game.redeem_date else '') + app.logger.error(f"Unexpected error: {traceback.format_exc()}") + flash(translate('Unexpected error: {error}', error=str(e)), 'error') + + return render_template( + 'edit_game.html', + game=game, + platforms=PLATFORM_CHOICES, + statuses=STATUS_CHOICES, + redeem_date=game.redeem_date.strftime('%Y-%m-%d') if game.redeem_date else '' + ) @app.route('/delete/', methods=['POST']) @login_required def delete_game(game_id): - game = db.session.get(Game, game_id) - if not game or game.owner != current_user: - abort(404) - - if game.owner != current_user: - abort(403) - - try: - db.session.delete(game) - db.session.commit() - except Exception as e: - db.session.rollback() - + game = Game.query.get_or_404(game_id) + db.session.delete(game) + db.session.commit() + flash(translate('Game deleted successfully'), 'success') return redirect(url_for('index')) @@ -434,11 +846,14 @@ def export_pdf(): elements = [] img_height = 2*cm - # Titel - elements.append(Paragraph(_("Game List (without Keys)"), styles['Title'])) + # Title + elements.append(Paragraph( + translate("Game List (without Keys)", lang=session.get('lang', 'en')), + styles['Title'] + )) elements.append(Spacer(1, 12)) - # Tabellenkopf + # Table header col_widths = [ 5*cm, 10*cm, 6*cm, 3*cm ] @@ -472,7 +887,7 @@ def export_pdf(): game.redeem_date.strftime('%d.%m.%y') if game.redeem_date else '' ]) - # Table format (korrekte Einrückung) + # Table format table = Table(data, colWidths=col_widths, repeatRows=1) table.setStyle(TableStyle([ ('FONTNAME', (0,0), (-1,0), 'Helvetica-Bold'), @@ -535,71 +950,249 @@ def import_games(): db.session.commit() - flash(_('%(new)d new games imported, %(dup)d skipped duplicates', new=new_games, dup=duplicates), 'success') + flash(translate("new_games_imported", new=new_games, dup=duplicates), 'success') except Exception as e: db.session.rollback() - flash(_('Import error: %(error)s', error=str(e)), 'danger') + flash(translate('Import error: {error}', error=str(e)), 'danger') return redirect(url_for('index')) - flash(_('Please upload a valid CSV file.'), 'danger') + flash(translate('Please upload a valid CSV file.'), 'danger') return render_template('import.html') @app.route('/generate_redeem/', methods=['POST']) @login_required def generate_redeem(game_id): - game = db.session.get(Game, game_id) - if not game or game.owner != current_user: - abort(403) - - if game.owner != current_user or game.status != 'verschenkt': - abort(403) - + game = Game.query.get_or_404(game_id) + if game.user_id != current_user.id or game.status != 'geschenkt': + return jsonify({'error': translate('Forbidden')}), 403 + try: - token = secrets.token_urlsafe(12)[:17] - expires = datetime.utcnow() + timedelta(hours=24) - total_hours = 24 - RedeemToken.query.filter_by(game_id=game_id).delete() - + token = secrets.token_urlsafe(12)[:17] + expires = datetime.now(local_tz) + timedelta(hours=24) new_token = RedeemToken( token=token, game_id=game_id, expires=expires, total_hours=24 ) - db.session.add(new_token) db.session.commit() - - redeem_url = url_for('redeem_page', token=token, _external=True) - return jsonify({'url': redeem_url}) - + redeem_url = url_for('redeem', token=token, _external=True) + message = translate( + 'Redeem link generated: {url}', + url=redeem_url + ) + return jsonify({'url': redeem_url, 'message': message}) except Exception as e: - app.logger.error(f"Redeem error: {str(e)}") + db.session.rollback() return jsonify({'error': str(e)}), 500 -@app.route('/redeem/') +@app.route('/redeem/', endpoint='redeem') def redeem_page(token): redeem_token = RedeemToken.query.filter_by(token=token).first() - if not redeem_token: abort(404) - if redeem_token.expires < datetime.utcnow(): + expires_utc = redeem_token.expires.astimezone(pytz.UTC) + if datetime.now(pytz.UTC) > expires_utc: db.session.delete(redeem_token) db.session.commit() abort(404) - game = Game.query.get(redeem_token.game_id) redeem_token.used = True db.session.commit() - return render_template('redeem.html', - game=game, - redeem_token=redeem_token, - platform_link='https://store.steampowered.com/account/registerkey?key=' if game.steam_appid else 'https://www.gog.com/redeem') + # which Plattform + if game.platform == "steam" or game.steam_appid: + platform_link = 'https://store.steampowered.com/account/registerkey?key=' + platform_label = "Steam" + elif game.platform == "gog": + platform_link = 'https://www.gog.com/redeem/' + platform_label = "GOG" + elif game.platform == "xbox": + platform_link = 'https://redeem.microsoft.com/' + platform_label = "XBOX" + elif game.platform == "playstation": + platform_link = 'https://store.playstation.com/redeem' + platform_label = "PlayStation" + else: + platform_link = '#' + platform_label = game.platform.capitalize() if game.platform else "Unknown" + + return render_template( + 'redeem.html', + game=game, + redeem_token=redeem_token, + expires_timestamp=int(expires_utc.timestamp() * 1000), + platform_link=platform_link, + platform_label=platform_label + ) + +@app.route('/admin/users') +@login_required +@admin_required +def admin_users(): + users = User.query.all() + return render_template('admin_users.html', users=users) + +@app.route('/admin/users/delete/', methods=['POST']) +@login_required +@admin_required +def admin_delete_user(user_id): + if current_user.id == user_id: + flash(translate('You cannot delete yourself'), 'error') + return redirect(url_for('admin_users')) + + user = User.query.get_or_404(user_id) + db.session.delete(user) + db.session.commit() + + log_activity( + current_user.id, + 'user_deleted', + f"Deleted user: {user.username} (ID: {user.id})" + ) + + flash(translate('User deleted successfully'), 'success') + return redirect(url_for('admin_users')) + +@app.route('/admin/users/reset_password/', methods=['POST']) +@login_required +@admin_required +def admin_reset_password(user_id): + user = User.query.get_or_404(user_id) + new_password = secrets.token_urlsafe(8) + user.password = generate_password_hash(new_password) + db.session.commit() + + log_activity( + current_user.id, + 'user_newpassword', + f"New password for user: {user.username} (ID: {user.id})" + ) + + + flash( + translate('New password for {username}: {password}', + username=user.username, + password=new_password), + 'info' + ) + return redirect(url_for('admin_users')) + +@app.route('/admin/audit-logs') +@login_required +@admin_required +def admin_audit_logs(): + page = request.args.get('page', 1, type=int) + logs = ActivityLog.query.order_by(ActivityLog.timestamp.desc()).paginate(page=page, per_page=20) + return render_template('admin_audit_logs.html', logs=logs) + +@app.route('/game//update', methods=['POST']) +@login_required +def update_game_data(game_id): + game = Game.query.get_or_404(game_id) + + # 1. Getting Steam AppID + steam_appid = request.form.get('steam_appid', '').strip() + app.logger.info(f"🚀 Update gestartet für Game {game_id} mit AppID: {steam_appid}") + + # 2. Steam-Data (Multilingual) + if steam_appid: + try: + app.logger.debug(f"🔍 Fetching Steam data for AppID: {steam_appid}") + for lang in ['en', 'de']: + steam_data = fetch_steam_data(steam_appid, lang=lang) + if steam_data: + if lang == 'en' and steam_data.get("name"): + game.name = steam_data.get("name", game.name) + setattr(game, f'steam_description_{lang}', steam_data.get("detailed_description") or "No Infos available") + if lang == 'en': + date_str = steam_data.get("release_date", {}) + if date_str: + parsed_date = parse_steam_release_date(date_str) + if parsed_date: + game.release_date = local_tz.localize(parsed_date) + else: + app.logger.warning(f"Could not parse Steam release date: {date_str}") + app.logger.info("✅ Steam data successfully updated") + except Exception as e: + app.logger.error(f"💥 Kritischer Steam-Fehler: {str(e)}", exc_info=True) + flash(translate('Error during Steam query'), 'danger') + else: + app.logger.warning("⚠️ Keine Steam-AppID vorhanden, Steam-Daten werden nicht aktualisiert") + flash(translate('Steam-AppID missing, no Steam Data transferred'), 'warning') + + + # ITAD-Slug doings and such + itad_slug = fetch_itad_slug(steam_appid) + if itad_slug: + game.itad_slug = itad_slug + + # 4. ITAD-Prices + price_data = None + if steam_appid: + try: + app.logger.debug("🔄 Starte ITAD-Abfrage...") + game.itad_game_id = fetch_itad_game_id(steam_appid) + + if game.itad_game_id: + app.logger.info(f"🔑 ITAD Game ID: {game.itad_game_id}") + price_data = fetch_itad_prices(game.itad_game_id) + + if price_data: + # Best price right now + all_deals = price_data.get("deals", []) + if all_deals: + best_deal = min( + all_deals, + key=lambda deal: deal.get("price", {}).get("amount", float('inf')) + ) + game.current_price = best_deal.get("price", {}).get("amount") + game.current_price_shop = best_deal.get("shop", {}).get("name") + app.logger.info(f"💶 Current Best: {game.current_price}€ at {game.current_price_shop}") + else: + game.current_price = None + game.current_price_shop = None + + app.logger.info(f"💶 Current Best: {game.current_price}€") + + game.historical_low = price_data.get("historyLow", {}).get("all", {}).get("amount") + app.logger.info(f"📉 Historical Low: {game.historical_low}€") + else: + app.logger.warning("⚠️ Keine ITAD-Preisdaten erhalten") + else: + app.logger.warning("⚠️ Keine ITAD Game ID erhalten") + + except Exception as e: + app.logger.error(f"💥 ITAD-API-Fehler: {str(e)}", exc_info=True) + flash(translate('Fehler bei Preisabfrage'), 'danger') + + try: + db.session.commit() + flash(translate('Externe Daten erfolgreich aktualisiert!'), 'success') + app.logger.info("💾 Datenbank-Update erfolgreich") + except Exception as e: + db.session.rollback() + app.logger.error(f"💥 Datenbank-Fehler: {str(e)}", exc_info=True) + flash(translate('Fehler beim Speichern der Daten'), 'danger') + + return redirect(url_for('edit_game', game_id=game_id)) + + +@app.route('/game/') +@login_required +def game_details(game_id): + game = Game.query.get_or_404(game_id) + return render_template('game_details.html', game=game) + + +@app.route('/debug-session') +def debug_session(): + return jsonify(dict(session)) # Apprise Notifications import apprise @@ -626,45 +1219,109 @@ def send_notification(user, game): return send_apprise_notification(user, game) def check_expiring_keys(): - with app.app_context(): - now = datetime.utcnow() - expiry_threshold = now + timedelta(hours=48) - - # Moderner Select-Aufruf - stmt = select(Game).where( - Game.status != 'eingelöst', - Game.redeem_date <= expiry_threshold, - Game.redeem_date > now - ) - - expiring_games = db.session.execute(stmt).scalars().all() - - for game in expiring_games: - user = User.query.get(game.user_id) - if user.notification_service and user.notification_service != 'none': - send_notification(user, game) + now = datetime.now(local_tz) + expiry_threshold = now + timedelta(hours=48) + + stmt = select(Game).where( + Game.status != 'eingelöst', + Game.redeem_date <= expiry_threshold, + Game.redeem_date > now + ) + + expiring_games = db.session.execute(stmt).scalars().all() + + for game in expiring_games: + user = User.query.get(game.user_id) + if user.notification_service and user.notification_service != 'none': + send_notification(user, game) # Optional: cleaning up old tokens def cleanup_expired_tokens(): - now = datetime.utcnow() - expired = RedeemToken.query.filter(RedeemToken.expires < now).all() - for token in expired: - db.session.delete(token) - db.session.commit() + with app.app_context(): + try: + now = datetime.now(local_tz) + expired = RedeemToken.query.filter(RedeemToken.expires < now).all() + for token in expired: + db.session.delete(token) + db.session.commit() + app.logger.info(f"Cleaned up {len(expired)} expired tokens.") + except Exception as e: + app.logger.error(f"Error during cleanup_expired_tokens: {e}") + db.session.rollback() # Scheduler start -scheduler = BackgroundScheduler() -scheduler.add_job(func=check_expiring_keys, trigger="interval", hours=interval_hours) -scheduler.add_job(func=cleanup_expired_tokens, trigger="interval", hours=1) -scheduler.start() +scheduler = BackgroundScheduler(timezone=str(local_tz)) -# Shutdown of the Schedulers when stopping the app -atexit.register(lambda: scheduler.shutdown()) +def check_expiring_keys_job(): + with app.app_context(): + check_expiring_keys() + +def cleanup_expired_tokens_job(): + with app.app_context(): + cleanup_expired_tokens() + +# Add Jobs +scheduler.add_job( + check_expiring_keys_job, + 'interval', + hours=int(os.getenv('CHECK_EXPIRING_KEYS_INTERVAL_HOURS', 12)), + id='check_expiring_keys' +) +scheduler.add_job( + cleanup_expired_tokens_job, + 'interval', + hours=1, + id='cleanup_expired_tokens' +) +# price updates +def update_prices_job(): + with app.app_context(): + games = Game.query.filter(Game.steam_appid.isnot(None)).all() + for game in games: + # just update prices + itad_data = fetch_itad_data(f"app/{game.steam_appid}") + if itad_data: + game.current_price = itad_data.get('price_new') + game.historical_low = itad_data.get('price_low', {}).get('amount') + db.session.commit() + +scheduler.add_job( + update_prices_job, + 'interval', + hours=12, + id='update_prices' +) + + +def update_missing_steam_descriptions_job(): + with app.app_context(): + games = Game.query.filter( + (Game.steam_description_en == None) | (Game.steam_description_en == '') | + (Game.steam_description_de == None) | (Game.steam_description_de == '') + ).all() + for game in games: + for lang in ['en', 'de']: + if not getattr(game, f'steam_description_{lang}', None): + steam_data = fetch_steam_data(game.steam_appid, lang=lang) + if steam_data: + setattr(game, f'steam_description_{lang}', steam_data.get('detailed_description')) + db.session.commit() + +scheduler.add_job( + update_missing_steam_descriptions_job, + 'interval', + hours=24, + id='update_missing_steam_descriptions' +) + +# start Scheduler +scheduler.start() +atexit.register(lambda: scheduler.shutdown(wait=False)) if __name__ == '__main__': with app.app_context(): db.create_all() - app.run(host='0.0.0.0', port=5000) + app.run(debug=True, host='0.0.0.0', port=5000) diff --git a/steam-gift-manager/docker-compose.yml b/steam-gift-manager/docker-compose.yml index 0840c1d..a9886bd 100644 --- a/steam-gift-manager/docker-compose.yml +++ b/steam-gift-manager/docker-compose.yml @@ -1,15 +1,44 @@ services: + redis: + image: redis:alpine + ports: + - "6379:6379" + volumes: + - redis_data:/data + networks: + - app-network + steam-manager: - build: . + build: + context: . + args: + - UID=0 + - GID=1000 ports: - "5000:5000" + - "5678:5678" + env_file: + - .env environment: - - REGISTRATION_ENABLED=True - - TZ= + - REDIS_URL=redis://redis:6379/0 volumes: - - ../data:/app/data + - ../data:/app/data - ./translations:/app/translations:rw - - ../.env:/app/.env - user: "0:" + - ./static:/app/static:rw + user: "0:1000" restart: unless-stopped + command: ["/app/entrypoint.sh"] + networks: + - app-network + depends_on: + - redis + +volumes: + redis_data: + +networks: + app-network: + driver: bridge + + diff --git a/steam-gift-manager/entrypoint.sh b/steam-gift-manager/entrypoint.sh new file mode 100644 index 0000000..877de46 --- /dev/null +++ b/steam-gift-manager/entrypoint.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +# Debug-Output +echo "🔄 DEBUGPY-Value: ''" +echo "🔄 FLASK_DEBUG-Value: ''" + +# Debug-Modus activate if .env told you so +if [[ "" == "1" || "" == "1" ]]; then + echo "🔄 Starting in DEBUG mode (Port 5678)..." + exec python -m debugpy --listen 0.0.0.0:5678 -m flask run --host=0.0.0.0 --port=5000 +else + echo "🚀 Starting in PRODUCTION mode..." + exec gunicorn -b 0.0.0.0:5000 app:app +fi + + diff --git a/steam-gift-manager/requirements.txt b/steam-gift-manager/requirements.txt index 01baa3b..2a2c066 100644 --- a/steam-gift-manager/requirements.txt +++ b/steam-gift-manager/requirements.txt @@ -14,3 +14,7 @@ requests pillow gunicorn apprise +debugpy +pytz +Flask-Session +redis diff --git a/steam-gift-manager/static/apple-touch-icon.png b/steam-gift-manager/static/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..14e6c59f4edadf67cb61df1274bf7e0490eafc37 GIT binary patch literal 24079 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

xajND@~0WLNHqp8cC5m19}E>Tj; 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 literal 0 HcmV?d00001 diff --git a/steam-gift-manager/static/favicon.ico b/steam-gift-manager/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..b3433b0e791af5e653f238f7043ea779a21c4a5e GIT binary patch literal 15086 zcmeHO`BPO_w%+GnX70VrqC^Em93n~}it~V)RzW2y2#6>kGAe?A=#^0oD$dLfOeX1c zqITlYt)|;VP50~fUiS~()m2^Zy{gyset7@K_r7(`JwOmpV<&CZgQ`{goIR~?4SSz` z*V-thDXV(#J;gFY{UTba1f^6&gzMd3slT(%pQW@Hxhd7m4s+OtLsSk)>c{$<=BqG4 z6FQjife9a&@PP>*nDBwO#|NhK+bk4rdy&SgAIpZ*IgdH#;4|yS>OXC~wsFo4;cScG z*jYgeSsN7^3N^i3YTi!aOIE%6`R!{l_zT`->l(q ziUpsa4#0`MUMM4>>QRemRenf+c2(!s$Z_SIQL1li7EN!p+kPDJzUIBjptg zKR>6?cT!>dDuqagVY~6<7~~bEaK2hY-7baHcNH?@HSAez!QLfS>|N}J>;$V`pB1N} z*Et2H>%Eb`QsFTBM^KkKk-uP&=S4F_7YZkH6?SmGUGWO-)wJyfg(!cQe%V)-fu*iP zj_YYs*tf>$yD#PCc93zA9Cz)c6*Z|E(&j1bU*mrVOGp(fj423eI#x7klYrUtLkyM!gGm=_`Cq?4n<>m(+{y z(mja!=fCi^bw7cSI43PJYI^xOaoTyk4O>$A%*x zdZK8xfqw@3MLIOy-h%yX1!=#+PU=FiU#}x}>QrPi?-XtSKF1RO z7p+~$Y!j7f+hX5l9!&oimFPcLeyP7(bFqUJ*ziixReH`~}QeG*(g zbFPpW7AWK_rd^4BZxZ_i3}H8A7+DIhzK`f*T)!D{uZ~~lx!37HW(@a-9eyZFAHp9O zVa1&;JMMHl@ZZm4P_xYwEjiP0Y+E1>Br5#6N8wJV!Y$JM>s-@Z4|~Zwe;IYcx>U*- zP3*&cY$R^;UGVoeE9{}oWWC&KGwdS!@5}t>ey0brsk8bt2k}qF4C+(nTQS!Iw^}@q zIp5IfF7`RMFA&aDAMA;xj)^sw_7=)O)3g=dTQUILW+|fs$Xvp9? zr++v<1<`_L3BYI>qK5N0~L~oiWbBX^%h9?eXdJX!I=)~NIWPVx41v`SNe>X1Kl ze({k}{h#%w-`yo2!QYhWiG~uNK}@1ET?Uau@RRnZ2BJRGj_M>Uj^x@9$vU&&d(*gg z9;S}Df0j{?4LmzsZR9zFcHL+&#jcH=^!z;D;yyHVvfB{OyYC8 z{zsF+g9;Dndf6wt~eB3k#0}bKmub;{_Ye(O4ck~|D`0R-z$^2d? zv&;?A^*@8(uNA(tP~w(`8Z8qk0W;BmM#E+5yo}gn&V!^1?zz{U#9B*#noK+KS!5|^ zy~t`(8TT&1FW7Yd84W-8B(aU?Zq6iGr?le%%1)b>(B8!^Dx#kXiN6-H&U~+-|5W98 z>3+4zClO9-En1WljcN}{ts9UM7)?89=qmR?`D&g4iRo&M;YZQjKXrfPx1lOmLDoR! zI?5>iL^;d3wm;|k7n_dhKZ2j6@1c}o9`#XMsPJS!;c2hJwe6?S{~}O-B=qu4b8KYy)gT4-_lbA4`r>B#`T{QBU@A1>ENDf?xcFP@f zt1etqH_@x^a; z>in0)b&Z&xyXYxys^3zUhs6Dy<^R%;euW9fe@dcCL zNWXZ~ch|h8Z$;WQA7>>Gv)f1plu{QvQu{{0GZF(;iPL!!6pX4cYE1 zh~J{ycD!@tE9v+(WE+lupJyHMd`En@bo>MK7sC#Zh*kXO52WX8|10s|=d-Mbo9Ixd zvDAZvN2S036m@sZyU_cQwZx30B&A8nSeaKZ8&+rD*Szo*OD zr8>B;9>aEzctrYYKc2sgqYtsS`TKk)*T5C+JK`7Je?xoR#yQJbZ1GuwmA(sc(eiJs zdro?!@2w}aQu_YV!F}OPb@@Zbn|?IQWqDC763nu>8|!u)9sN*TuQSe+VFuUoV!J;+@C(BS{_kL=Uoe*X1!9GN zFcSRyv5N1j{U>3OpC2OWd$KS7)IL9!T!Lkj|8)F3BnLNwGtf6_7fuH!;bB+>{&lJo zO(7d`JtPAIld|#IAhX?G*$V5}f5u>0uv^z#$jWQ{Mddt*7p#4&%=`rJuAnmoYZNJj!Ui zrH|Z4sL!I@aTc^zyn_p+;kbBU8t(^qW5-<1acBz8asJ`4QsLdr_{syC;BrZ zhNsKVIpw#o{8l(sz&7fjEYqkPi9!0;?DJ?9&e?tWlkY^Zzk>?^BKR-9*6&4PkpY&{7{|utPtiP zbKUUSrBIa6A6iQzaDn`f6px>`$JzsH=?9@>q(1(O-S99f=WOg=r<;IHdu#Mw#e zj&jay_Gu~z)$J5F-GcK47G$w*H>thcrsu8ms7I5U_cEup#fbL~=lQ|=3d?2>;b}R@ zxtV)A%>FO%cj>8y{3XBJRKR=>WtlgHJdXvUxqvy6Qcv_YYG}@-e;#1|jlT2|by-P! zw=pj=+ZBtKaY@X-NUp7md6f0!DfT*lh?u#4D#>Fs{^I*4|5L?2y8dM@iDL^%PV?g7 zDd?>9)#sBr#om%XlN@VTgK;Nh3)i0T)^nG{(O#t>b(boPd~4Mh{6%+1nQz{|NTKs+ z08&;3U~QZa)^RPYr;XQBFKsn8bX6L8*9c;YwfmtYF<8&ZN#3aUl)<}%{JOc`u2ANZ zrA9vTGW9QcNXaAV@>AZyHQ>^}+!<<>e#@xeyil~{1>sDdA5Q03aVAHDGsO+vRm@vc z_SuYi9Cj;0g|-#Bi9UM1R`O~G$ouM1?p1tFCU1F`I%$*qVHIV3fj@mw>O==}7owMb z-BZoj3uO@Mah3A?pp$YtCgGH|ld;m1IHeBYh$S7_EB*0lV*u~+7`#niTt~fq@)75x zFZ6NV4EoDx{6!Zg29ZzlSCTs%Nr@rRIO%p)&sX%RUo*yj3l~%ank>aw9XREMyqDmR zeEghH=8KpEllO7sb1qw$SWG#jjJLmo7E1@?+`rIc$^DEi_o#no{Pi(&71x;qs>Ldw z@WDMm<`|8}aFhtpz7gm2EzXyZ4j9%)$m-(b#^6pU*L%+k^WW65472JdVJ#x<1 zeAjhA`K#R9sdwhB7`GSREtWQ%wB9D)uPOg+=1#7l%(??Jd@bYK_%->PzB$hpf=2SY z#$3l0?GhIGhGCIyHgSB%826u0>9z}VZQh1|{{SB2>dR$^IJ*tCfr)4gUe7xO@hAv- zAI_jPs0~?*`3@h0_dihg!!d~+2155>vwsA3F!z5gbQi8Oro7ER3S0dn@#&PjA4hhV zE`|TS$)!5Ko59R`GbW$tHyOQ*L8b=G#+|T|AD#au|8N|mz9nWTc!ZWZ0&z5C4YmYC z{;2$QTacgWkHc*<@%)e5Z+=Q$GCc54{gXHa|HVv?Rs4U5Q^;9B&c#CW-!aa(`uCCR zN`Av7@VB4&E@zP8zVI&3BV}6^j_u^VwC!GS?({)Af1kRQ2HUyM7&dUcnj|%^LL({Gi0pX*FCt|xaY28VBMw! zg+s~Skl!VZ*>;@DbJNFFv7a-`IA;sSV$Lb|_^P)P7sr_6lNR%gz1Hqja*|DC5anNal9(_gm`$FI+CQ;9?=~0CJ8J_dHYv z{EYW%JyFNs1dC>}-!9{RWFpVb`gqyHIfv*fiZ;;CWI^sY=IPYW4&6M*9dR$fT!*KA zb_wVCIx@h}#c&&#vWSkdJ@R=Tc|?-${~vk&d5lbtL}L#Y%;SB7*`DAt7aiI|INfSd zJAdrK`*`EXs zR1aWPo`-hUM1?)cBvw#3AkqN<0I&-HodGH!03ZN9MH-4kBB7xh^Z+OXM797}lAyl; z;uK)?4c{);ABWP#!LwKs=Z_z&!vzU_B~5iob1tZT+H*2h%z6#>C@P$Q*DJ zi*7&vJ!bH&9+!IE_en0>K{{L3N2Acr{0;%WnMvD*Jz2{FuwD-<2g8%Tu51=!nU|#T0e8gUZS6&;!aXqbgu`Hf0awW(qwW0vWe}jz+Tcn(UQELXWpGL zgInjf+cp9k^OGXp{PjlbD}H4yOLOohB{^7vFrmO WCKq#w@p&PD?YXUr^dOFjIS>FydtRvk literal 0 HcmV?d00001 diff --git a/steam-gift-manager/static/gog_logo.webp b/steam-gift-manager/static/gog_logo.webp new file mode 100644 index 0000000000000000000000000000000000000000..ce9a8a91ca386dc0bfec87ec1d5d62238320e4d0 GIT binary patch literal 6938 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 literal 0 HcmV?d00001 diff --git a/steam-gift-manager/static/logo.webp b/steam-gift-manager/static/logo.webp new file mode 100644 index 0000000000000000000000000000000000000000..7196e01013487bee760e66109767e468d8b8aaf8 GIT binary patch literal 8326 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 QFkP3fv;Y7A000000GGLeSO5S3 literal 0 HcmV?d00001 diff --git a/steam-gift-manager/static/logo_small.webp b/steam-gift-manager/static/logo_small.webp new file mode 100644 index 0000000000000000000000000000000000000000..424e4bb77caabd272ac68da74a8e4a1b3d5b6dcd GIT binary patch literal 6050 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 literal 0 HcmV?d00001 diff --git a/steam-gift-manager/static/manifest.json b/steam-gift-manager/static/manifest.json index 56e7189..05ba690 100644 --- a/steam-gift-manager/static/manifest.json +++ b/steam-gift-manager/static/manifest.json @@ -13,22 +13,25 @@ }, "icons": [ { - "src": "/static/logo_small.webp", + "src": "/static/web-app-manifest-192x192.png", "sizes": "192x192", "type": "image/webp", "purpose": "any" }, { - "src": "/static/logo_small_maskable.webp", + "src": "/static/web-app-manifest-192x192.png", "sizes": "192x192", - "type": "image/webp", + "type": "image/png", "purpose": "maskable" }, { - "src": "/static/logo.webp", + "src": "/static/web-app-manifest-512x512.png", "sizes": "512x512", - "type": "image/webp", - "purpose": "any maskable" + "type": "image/png", + "purpose": "maskable" } - ] + ], + "theme_color": "#ffffff", + "background_color": "#3f3a3a", + "display": "standalone" } diff --git a/steam-gift-manager/static/serviceworker.js b/steam-gift-manager/static/serviceworker.js index 4fc266b..db9ab63 100644 --- a/steam-gift-manager/static/serviceworker.js +++ b/steam-gift-manager/static/serviceworker.js @@ -3,6 +3,8 @@ const ASSETS = [ '/', '/static/style.css', '/static/logo.webp', + '/static/web-app-manifest-512x512.png', + '/static/web-app-manifest-192x192.png', '/static/logo_small.webp', '/static/gog_logo.webp', '/static/forgejo.webp' diff --git a/steam-gift-manager/static/style.css b/steam-gift-manager/static/style.css index c056d1d..f5088d8 100644 --- a/steam-gift-manager/static/style.css +++ b/steam-gift-manager/static/style.css @@ -133,3 +133,38 @@ body { border: 0; } +.price-value { + font-size: 1.2em; + font-weight: 400; + margin-top: 2px; +} + +.navbar-nav .nav-link { + white-space: nowrap; +} + +@media (max-width: 991.98px) { + .navbar-nav { + flex-direction: column !important; + align-items: flex-start !important; + } +} + +.card-body img, +.steam-description img { + max-width: 100%; + height: auto; + display: block; + margin: 8px auto; +} + +td.font-monospace { + word-break: break-all; + /* or */ + overflow-wrap: break-word; +} + +.alert-error { background-color: #f8d7da; border-color: #f5c6cb; color: #721c24; } +.alert-success { background-color: #d4edda; border-color: #c3e6cb; color: #155724; } +.alert-info { background: #d9edf7; color: #31708f; } + diff --git a/steam-gift-manager/static/web-app-manifest-192x192.png b/steam-gift-manager/static/web-app-manifest-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..92a5881a840514d6ce102ab21fd6bbda8a86d34a GIT binary patch literal 25895 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 K<*Q|_!~O@zwnP8` literal 0 HcmV?d00001 diff --git a/steam-gift-manager/static/web-app-manifest-512x512.png b/steam-gift-manager/static/web-app-manifest-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..a55a74131064b2e9e432b6166851369af89210ac GIT binary patch literal 131482 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 T_hW3ReE=B=Me(YSh5`QzQE5M+ literal 0 HcmV?d00001 diff --git a/steam-gift-manager/templates/403.html b/steam-gift-manager/templates/403.html new file mode 100644 index 0000000..2aa4783 --- /dev/null +++ b/steam-gift-manager/templates/403.html @@ -0,0 +1,25 @@ +{% extends "base.html" %} +{% block content %} +

+
+ Forbidden +

403

+

{{ _('Access Forbidden') }}

+

+ {{ _('Sorry, you are not allowed to access this page.') }} + ({{ _('Registration is currently disabled.') }}) +

+
+ 🏠 {{ _('Back to Home') }} + +
+ + Sorry, you haven't unlocked this area yet. Grind some more XP or check your DLC entitlements.
Maybe try again after the next patch?
+
+
+
+
+{% endblock %} diff --git a/steam-gift-manager/templates/404.html b/steam-gift-manager/templates/404.html new file mode 100644 index 0000000..e7145be --- /dev/null +++ b/steam-gift-manager/templates/404.html @@ -0,0 +1,25 @@ +{% extends "base.html" %} +{% block content %} +
+
+ Forbidden +

404

+

{{ _('Access Forbidden') }}

+

+ {{ _('Sorry, you are not allowed to access this page.') }} + ({{ _('Registration is currently disabled.') }}) +

+ + 🏠 {{ _('Back to Home') }} + +
+ + Sorry, you haven't unlocked this area yet. Grind some more XP or check your DLC entitlements.
Maybe try again after the next patch?
+
+
+
+
+{% endblock %} diff --git a/steam-gift-manager/templates/add_game.html b/steam-gift-manager/templates/add_game.html index 65ad86c..88f6d24 100644 --- a/steam-gift-manager/templates/add_game.html +++ b/steam-gift-manager/templates/add_game.html @@ -1,51 +1,94 @@ {% extends "base.html" %} {% block content %}
-

{{ _('Add New Game') }}

-
- -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - {{ _('Cancel') }} -
-
-
+

{{ _('Add Game') }}

+ {% with messages = get_flashed_messages(with_categories=true) %} + {% if messages %} +
+ {% for category, message in messages %} +
+ {{ message|safe }} +
+ {% endfor %} +
+ {% endif %} + {% endwith %} +
+ +
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + {{ _('Cancel') }} +
+
+
{% endblock %} + diff --git a/steam-gift-manager/templates/admin_audit_logs.html b/steam-gift-manager/templates/admin_audit_logs.html new file mode 100644 index 0000000..5c8b935 --- /dev/null +++ b/steam-gift-manager/templates/admin_audit_logs.html @@ -0,0 +1,55 @@ +{% extends "base.html" %} + +{% block content %} +
+

{{ _('Audit Logs') }}

+ +
+ + + + + + + + + + + {% for log in logs.items %} + + + + + + + {% endfor %} + +
{{ _('Timestamp') }}{{ _('User') }}{{ _('Action') }}{{ _('Details') }}
{{ log.timestamp|strftime('%d.%m.%Y %H:%M') }}{{ log.user.username if log.user else 'System' }}{{ log.action }}{{ log.details|default('', true) }}
+
+ + {% if logs.pages > 1 %} + + {% endif %} +
+{% endblock %} + diff --git a/steam-gift-manager/templates/admin_users.html b/steam-gift-manager/templates/admin_users.html new file mode 100644 index 0000000..e2f1398 --- /dev/null +++ b/steam-gift-manager/templates/admin_users.html @@ -0,0 +1,39 @@ +{% extends "base.html" %} + +{% block content %} +
+

{{ _('User Management') }}

+ + + + + + + + + {% for user in users %} + + + + + {% endfor %} + +
{{ _('Username') }}{{ _('Actions') }}
+ {{ user.username }} + {% if user.is_admin %}Admin{% endif %} + + {% if user.id != current_user.id %} +
+ + +
+ +
+ + +
+ {% endif %} +
+
+{% endblock %} + diff --git a/steam-gift-manager/templates/base.html b/steam-gift-manager/templates/base.html index 1f112fa..9781a06 100644 --- a/steam-gift-manager/templates/base.html +++ b/steam-gift-manager/templates/base.html @@ -11,9 +11,8 @@ - + - {# LCP-Optimierung: Preload für das erste Cover-Bild, falls vorhanden #} {% if games and games[0].steam_appid %} - +
{% with messages = get_flashed_messages(with_categories=true) %} {% if messages %} - {% for category, message in messages %} -
- {{ message }} - +
+ {% for category, message in messages %} + + {% endfor %}
- {% endfor %} {% endif %} {% endwith %} {% block content %}{% endblock %} diff --git a/steam-gift-manager/templates/edit_game.html b/steam-gift-manager/templates/edit_game.html index 81db0bd..e33e108 100644 --- a/steam-gift-manager/templates/edit_game.html +++ b/steam-gift-manager/templates/edit_game.html @@ -1,35 +1,85 @@ {% extends "base.html" %} {% block content %}
-

{{ _('Edit Game') }}

-
+

{{ _('Spiel bearbeiten') }}

+ + + {% with messages = get_flashed_messages(with_categories=true) %} + {% if messages %} +
+ {% for category, message in messages %} +
+ {{ message|safe }} + +
+ {% endfor %} +
+ {% endif %} + {% endwith %} + + +
+ + + + + + + +
+ +
+
- - + +
- - -
-
- - -
-
- - + {% for value, label in platforms %} + + {% endfor %}
-
- - +
+ +
-
+
+ + +
+
+ + + + {{ _('For GOG games: Enter the Steam AppID here to enable price tracking.') }} + +
+
+ + +
+
@@ -41,27 +91,95 @@
+ +
- {% if redeem_url and active_redeem %} -
- - - - {{ _('Expires at') }}: {{ active_redeem.expires.strftime('%d.%m.%Y %H:%M') }} - +
+
+ 🔄 {{ _('External Data') }} +
+
+ {% if game.release_date %} +
+ {{ _('Release Date:') }} + {{ game.release_date|strftime('%d.%m.%Y') }} +
+ {% endif %} + {% if game.current_price %} +
+ {{ _('Now') }} +
+ {{ "%.2f"|format(game.current_price) }} € +
+
+ {% endif %} + {% if game.historical_low %} +
+ {{ _('Hist. Low') }} +
+ {{ "%.2f"|format(game.historical_low) }} € +
+
+ {% endif %} + {% if game.itad_slug %} + + 🔗 {{ _('View on IsThereAnyDeal') }} + + {% endif %} +
- {% endif %}
+ + + {% if game.status == 'geschenkt' %} +
+
+
{{ _('Redeem-Link') }}
+
+ {% for token in game.redeem_tokens if not token.is_expired() %} +
+ + +
+ + {{ _('Expires at') }}: {{ token.expires.astimezone(local_tz).strftime('%d.%m.%Y %H:%M') }} + + {% else %} +

{{ _('No active redeem links') }}

+ {% endfor %} +
+
+
+ {% endif %} + +
+ + + {% endblock %} + + diff --git a/steam-gift-manager/templates/game_details.html b/steam-gift-manager/templates/game_details.html new file mode 100644 index 0000000..b4ed10e --- /dev/null +++ b/steam-gift-manager/templates/game_details.html @@ -0,0 +1,62 @@ +{% extends "base.html" %} +{% block content %} +
+
+

{{ game.name }}

+ +
+ +
+ {% if game.steam_appid %} + {{ game.name }} Cover + {% endif %} +
+ + +
+
+
{{ _('Status') }}
+
+ {% if game.status == 'nicht eingelöst' %} + {{ _('Not redeemed') }} + {% elif game.status == 'geschenkt' %} + {{ _('Gifted') }} + {% elif game.status == 'eingelöst' %} + {{ _('Redeemed') }} + {% endif %} +
+ +
{{ _('Release Date') }}
+
{{ game.release_date|strftime('%d.%m.%Y') if game.release_date else 'N/A' }}
+ +
{{ _('Current Price') }}
+
{{ "%.2f €"|format(game.current_price) if game.current_price else 'N/A' }}
+ +
+ + + {{ _('Edit') }} + +
+
+ {% set lang = session.get('lang', 'en') %} + {% set desc = getattr(game, 'steam_description_' + lang) %} + {% if desc %} +
+
+
+
{{ _('Game Description') }}
+
+ {{ desc|safe }} +
+
+
+
+ {% endif %} +
+
+{% endblock %} + diff --git a/steam-gift-manager/templates/index.html b/steam-gift-manager/templates/index.html index f9398a1..ea383e8 100644 --- a/steam-gift-manager/templates/index.html +++ b/steam-gift-manager/templates/index.html @@ -22,6 +22,7 @@ {{ _('Created') }} {{ _('Redeem by') }} {{ _('Shop') }} + {{ _('Price') }} {{ _('Actions') }} @@ -29,38 +30,40 @@ {% for game in games %} - {% if game.steam_appid %} - Steam Header - {% elif game.url and 'gog.com' in game.url %} - GOG Logo - {% endif %} + + {% if game.steam_appid %} + Steam Header + {% elif game.url and 'gog.com' in game.url %} + GOG Logo + {% endif %} + {{ game.name }} {{ game.steam_key }} {% if game.status == 'nicht eingelöst' %} {{ _('Not redeemed') }} - {% elif game.status == 'verschenkt' %} + {% elif game.status == 'geschenkt' %} {{ _('Gifted') }} {% elif game.status == 'eingelöst' %} {{ _('Redeemed') }} {% endif %} - {{ format_date(game.created_at) }} + {{ game.created_at|strftime('%d.%m.%Y') }} {% if game.redeem_date %} - {{ format_date(game.redeem_date) }} + {{ game.redeem_date|strftime('%d.%m.%Y') }} {% endif %} @@ -68,9 +71,37 @@ 🔗 {{ _('Shop') }} {% endif %} + + {% if game.current_price is not none %} +
+
+ {{ _('Current Deal') }} +
+
+ {{ "%.2f"|format(game.current_price) }} € + {% if game.current_price_shop %} + ({{ game.current_price_shop }}) + {% endif %} +
+
+ {% endif %} + + {# Historical Low #} + {% if game.historical_low is not none %} +
+
+ {{ _('Hist. Low') }} +
+
+ {{ "%.2f"|format(game.historical_low) }} € +
+
+ {% endif %} + - {% if game.status == 'verschenkt' %} -
-