From 4a0a5bac3f8542bafa914f87baf6277ec5a72df8 Mon Sep 17 00:00:00 2001 From: nocci Date: Sat, 3 May 2025 11:37:42 +0200 Subject: [PATCH 01/10] new folder structure / add de translation --- steam-gift-manager/Dockerfile | 2 +- steam-gift-manager/app.py | 196 ++++++------ steam-gift-manager/babel.cfg | 3 - steam-gift-manager/docker-compose.yml | 5 +- steam-gift-manager/requirements.txt | 3 +- steam-gift-manager/static/forgejo.svg | 1 - steam-gift-manager/static/forgejo.webp | Bin 740 -> 0 bytes steam-gift-manager/static/gog_logo.png | Bin 69873 -> 0 bytes steam-gift-manager/static/gog_logo.webp | Bin 6938 -> 0 bytes steam-gift-manager/static/logo.png | Bin 53171 -> 0 bytes steam-gift-manager/static/logo.webp | Bin 8326 -> 0 bytes steam-gift-manager/static/logo_small.png | Bin 35514 -> 0 bytes steam-gift-manager/static/logo_small.webp | Bin 6050 -> 0 bytes .../static/logo_small_maskable.png | Bin 20502 -> 0 bytes .../static/logo_small_maskable.webp | Bin 2568 -> 0 bytes steam-gift-manager/static/manifest.json | 34 +++ steam-gift-manager/static/serviceworker.js | 32 ++ steam-gift-manager/static/style.css | 73 +++++ steam-gift-manager/templates/add_game.html | 40 +-- steam-gift-manager/templates/base.html | 110 +++++-- .../templates/change_password.html | 26 +- steam-gift-manager/templates/edit_game.html | 121 ++++---- steam-gift-manager/templates/footer.html | 2 +- steam-gift-manager/templates/import.html | 6 +- steam-gift-manager/templates/index.html | 14 +- steam-gift-manager/templates/login.html | 60 ++-- steam-gift-manager/templates/register.html | 65 ++-- steam-gift-manager/translations/de.json | 71 +++++ steam-gift-manager/translations/en.json | 72 +++++ translate.sh | 51 ++-- translations/de/LC_MESSAGES/messages.mo | Bin 481 -> 0 bytes translations/de/LC_MESSAGES/messages.po | 274 ----------------- translations/en/LC_MESSAGES/messages.mo | Bin 445 -> 0 bytes translations/en/LC_MESSAGES/messages.po | 280 ------------------ translations/messages.pot | 279 ----------------- 35 files changed, 696 insertions(+), 1124 deletions(-) delete mode 100644 steam-gift-manager/babel.cfg delete mode 100644 steam-gift-manager/static/forgejo.svg delete mode 100644 steam-gift-manager/static/forgejo.webp delete mode 100644 steam-gift-manager/static/gog_logo.png delete mode 100644 steam-gift-manager/static/gog_logo.webp delete mode 100644 steam-gift-manager/static/logo.png delete mode 100644 steam-gift-manager/static/logo.webp delete mode 100644 steam-gift-manager/static/logo_small.png delete mode 100644 steam-gift-manager/static/logo_small.webp delete mode 100644 steam-gift-manager/static/logo_small_maskable.png delete mode 100644 steam-gift-manager/static/logo_small_maskable.webp create mode 100644 steam-gift-manager/static/manifest.json create mode 100644 steam-gift-manager/static/serviceworker.js create mode 100644 steam-gift-manager/translations/de.json create mode 100644 steam-gift-manager/translations/en.json delete mode 100644 translations/de/LC_MESSAGES/messages.mo delete mode 100644 translations/de/LC_MESSAGES/messages.po delete mode 100644 translations/en/LC_MESSAGES/messages.mo delete mode 100644 translations/en/LC_MESSAGES/messages.po delete mode 100644 translations/messages.pot diff --git a/steam-gift-manager/Dockerfile b/steam-gift-manager/Dockerfile index 681e017..ee654d4 100644 --- a/steam-gift-manager/Dockerfile +++ b/steam-gift-manager/Dockerfile @@ -2,7 +2,7 @@ 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.png "https://git.nocci.it/nocci/GiftGamesDB/raw/branch/main/steam-gift-manager/static/logo.png" && wget -O /app/static/logo_small.png "https://git.nocci.it/nocci/GiftGamesDB/raw/branch/main/steam-gift-manager/static/logo_small.png" && wget -O /app/static/forgejo.svg "https://git.nocci.it/nocci/GiftGamesDB/raw/branch/main/steam-gift-manager/static/forgejo.svg" && rm -rf /var/lib/apt/lists/* +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 mkdir -p /app/data && chown -R 1000:1000 /app/data diff --git a/steam-gift-manager/app.py b/steam-gift-manager/app.py index a32caca..64cf1a7 100644 --- a/steam-gift-manager/app.py +++ b/steam-gift-manager/app.py @@ -1,16 +1,15 @@ import os -import logging 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 flask_babel import Babel, _ 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 @@ -41,8 +40,39 @@ from reportlab.lib.utils import ImageReader from reportlab.lib.units import cm, inch, mm from io import BytesIO import reportlab.lib - +import logging +logging.basicConfig() app = Flask(__name__) + +# Load Languages +import os +import json + +TRANSLATION_DIR = os.path.join(os.path.dirname(__file__), 'translations') +SUPPORTED_LANGUAGES = ['de', 'en'] +TRANSLATIONS = {} + +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) + except Exception: + 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 + +## DEBUG Translations +if app.debug: + print(f"Loaded translations for 'de': {TRANSLATIONS.get('de', {})}") + csrf = CSRFProtect(app) convention = { @@ -62,14 +92,16 @@ load_dotenv(override=True) # App-Configuration app.config.update( SECRET_KEY=os.getenv('SECRET_KEY'), - SQLALCHEMY_DATABASE_URI=('sqlite:////app/data/games.db'), + SQLALCHEMY_DATABASE_URI='sqlite:////app/data/games.db', SQLALCHEMY_TRACK_MODIFICATIONS=False, - BABEL_DEFAULT_LOCALE=os.getenv('BABEL_DEFAULT_LOCALE'), - BABEL_SUPPORTED_LOCALES=os.getenv('BABEL_SUPPORTED_LOCALES').split(','), - BABEL_TRANSLATION_DIRECTORIES=os.getenv('BABEL_TRANSLATION_DIRECTORIES'), - SESSION_COOKIE_SECURE=os.getenv('SESSION_COOKIE_SECURE') == 'True', - WTF_CSRF_ENABLED=os.getenv('CSRF_ENABLED') == 'True', - REGISTRATION_ENABLED=os.getenv('REGISTRATION_ENABLED', 'True').lower() == 'true' + 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' ) interval_hours = int(os.getenv('CHECK_EXPIRING_KEYS_INTERVAL_HOURS', 12)) @@ -79,24 +111,28 @@ db = SQLAlchemy(app, metadata=metadata) migrate = Migrate(app, db) login_manager = LoginManager(app) login_manager.login_view = 'login' -babel = Babel(app) # Logging app.logger.addHandler(logging.StreamHandler()) app.logger.setLevel(logging.INFO) -@babel.localeselector -def get_locale(): - if 'lang' in session and session['lang'] in app.config['BABEL_SUPPORTED_LOCALES']: - return session['lang'] - return request.accept_languages.best_match(app.config['BABEL_SUPPORTED_LOCALES']) + +@app.before_request +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: + url = request.url.replace('http://', 'https://', 1) + app.logger.info(f"Redirecting to HTTPS: {url}") + return redirect(url, code=301) + @app.context_processor def inject_template_vars(): - return dict( - get_locale=get_locale, - theme='dark' if request.cookies.get('dark_mode') == 'true' else 'light' - ) + def _(key, **kwargs): + lang = session.get('lang', 'en') + return translate(key, lang, **kwargs) + theme = request.cookies.get('theme', 'light') + return dict(_=_, theme=theme) # DB Models class User(db.Model, UserMixin): @@ -163,14 +199,15 @@ def index(): @app.route('/set-lang/') def set_lang(lang): - if lang in app.config['BABEL_SUPPORTED_LOCALES']: + if lang in SUPPORTED_LANGUAGES: session['lang'] = lang return redirect(request.referrer or url_for('index')) - + @app.route('/set-theme/') def set_theme(theme): resp = make_response('', 204) - resp.set_cookie('dark_mode', 'true' if theme == 'dark' else 'false', max_age=60*60*24*365) + # 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']) @@ -190,7 +227,7 @@ def login(): @app.route('/register', methods=['GET', 'POST']) def register(): if not app.config['REGISTRATION_ENABLED']: - flash(_('Registrierungen sind deaktiviert'), 'danger') + flash(_('No new registrations. They are deactivated!'), 'danger') return redirect(url_for('login')) if request.method == 'POST': @@ -224,16 +261,16 @@ def change_password(): confirm_password = request.form['confirm_password'] if not check_password_hash(current_user.password, current_password): - flash(_('Aktuelles Passwort ist falsch'), 'danger') + flash(_('Current passwort is wrong'), 'danger') return redirect(url_for('change_password')) if new_password != confirm_password: - flash(_('Neue Passwörter stimmen nicht überein'), 'danger') + flash(_('New Passwords are not matching'), 'danger') return redirect(url_for('change_password')) current_user.password = generate_password_hash(new_password) db.session.commit() - flash(_('Passwort erfolgreich geändert'), 'success') + flash(_('Password changed successfully'), 'success') return redirect(url_for('index')) return render_template('change_password.html') @@ -421,6 +458,12 @@ def export_pdf(): img = Image(img_data, width=3*cm, height=img_height) except Exception: img = Paragraph('', styles['Normal']) + elif game.url and 'gog.com' in game.url: + try: + img_path = os.path.join(app.root_path, 'static', 'gog_logo.webp') + img = Image(img_path, width=3*cm, height=img_height) + except Exception: + img = Paragraph('', styles['Normal']) data.append([ img or '', @@ -429,7 +472,7 @@ def export_pdf(): game.redeem_date.strftime('%d.%m.%y') if game.redeem_date else '' ]) - # Table format + # Table format (korrekte Einrückung) table = Table(data, colWidths=col_widths, repeatRows=1) table.setStyle(TableStyle([ ('FONTNAME', (0,0), (-1,0), 'Helvetica-Bold'), @@ -445,13 +488,14 @@ def export_pdf(): doc.build(elements) buffer.seek(0) - return send_file( + return send_file( buffer, mimetype='application/pdf', as_attachment=True, download_name=f'game_export_{datetime.now().strftime("%Y%m%d")}.pdf' ) + @app.route('/import', methods=['GET', 'POST']) @login_required def import_games(): @@ -491,15 +535,15 @@ def import_games(): db.session.commit() - flash(_('%(new)d neue Spiele importiert, %(dup)d Duplikate übersprungen', new=new_games, dup=duplicates), 'success') + flash(_('%(new)d new games imported, %(dup)d skipped duplicates', new=new_games, dup=duplicates), 'success') except Exception as e: db.session.rollback() - flash(_('Importfehler: %(error)s', error=str(e)), 'danger') + flash(_('Import error: %(error)s', error=str(e)), 'danger') return redirect(url_for('index')) - flash(_('Bitte eine gültige CSV-Datei hochladen.'), 'danger') + flash(_('Please upload a valid CSV file.'), 'danger') return render_template('import.html') @@ -557,81 +601,29 @@ def redeem_page(token): redeem_token=redeem_token, platform_link='https://store.steampowered.com/account/registerkey?key=' if game.steam_appid else 'https://www.gog.com/redeem') -# Benachrichtigungsfunktionen -def send_pushover_notification(user, game): - """Sendet Pushover-Benachrichtigung für ablaufenden Key""" - if not app.config['PUSHOVER_APP_TOKEN'] or not app.config['PUSHOVER_USER_KEY']: - return False - - payload = { - "token": os.getenv('PUSHOVER_APP_TOKEN'), - "user": os.getenv('PUSHOVER_USER_KEY'), - "title": "Steam-Key läuft ab!", - "message": f"Dein Key für '{game.name}' läuft in weniger als 48 Stunden ab!", - "url": url_for('edit_game', game_id=game.id, _external=True), - "url_title": "Zum Spiel", - "priority": 1 - } - - try: - response = requests.post( - 'https://api.pushover.net/1/messages.json', - data=payload - ) - return response.status_code == 200 - except Exception as e: - app.logger.error(f"Pushover error: {str(e)}") +# Apprise Notifications +import apprise + +def send_apprise_notification(user, game): + apprise_urls = os.getenv('APPRISE_URLS', '').strip() + if not apprise_urls: + app.logger.error("No APPRISE_URLS configured") return False -def send_gotify_notification(user, game): - """Sendet Gotify-Benachrichtigung für ablaufenden Key""" - if not GOTIFY_URL or not GOTIFY_TOKEN: - return False - - payload = { - "title": "Steam-Key läuft ab!", - "message": f"Dein Key für '{game.name}' läuft in weniger als 48 Stunden ab!", - "priority": 5 - } - - try: - response = requests.post( - f"{GOTIFY_URL}/message?token={GOTIFY_TOKEN}", - json=payload - ) - return response.status_code == 200 - except Exception as e: - app.logger.error(f"Gotify error: {str(e)}") - return False + apobj = apprise.Apprise() + for url in apprise_urls.replace(',', '\n').splitlines(): + if url.strip(): + apobj.add(url.strip()) -def send_matrix_notification(user, game): - """Sendet Matrix-Benachrichtigung für ablaufenden Key""" - if not MATRIX_HOMESERVER or not MATRIX_ACCESS_TOKEN or not MATRIX_ROOM_ID: - return False - - try: - from matrix_client.client import MatrixClient - - client = MatrixClient(MATRIX_HOMESERVER, token=MATRIX_ACCESS_TOKEN) - room = client.join_room(MATRIX_ROOM_ID) - - message = f"🎮 Dein Key für '{game.name}' läuft in weniger als 48 Stunden ab!" - room.send_text(message) - - return True - except Exception as e: - app.logger.error(f"Matrix error: {str(e)}") - return False + edit_url = url_for('edit_game', game_id=game.id, _external=True) + result = apobj.notify( + title="Steam-Key läuft ab!", + body=f"Dein Key für '{game.name}' läuft in weniger als 48 Stunden ab!\n\nLink: {edit_url}", + ) + return result def send_notification(user, game): - """Sendet Benachrichtigung über den bevorzugten Dienst des Benutzers""" - if user.notification_service == 'pushover': - return send_pushover_notification(user, game) - elif user.notification_service == 'gotify': - return send_gotify_notification(user, game) - elif user.notification_service == 'matrix': - return send_matrix_notification(user, game) - return False + return send_apprise_notification(user, game) def check_expiring_keys(): with app.app_context(): diff --git a/steam-gift-manager/babel.cfg b/steam-gift-manager/babel.cfg deleted file mode 100644 index f0234b3..0000000 --- a/steam-gift-manager/babel.cfg +++ /dev/null @@ -1,3 +0,0 @@ -[python: **.py] -[jinja2: **/templates/**.html] -extensions=jinja2.ext.autoescape,jinja2.ext.with_ diff --git a/steam-gift-manager/docker-compose.yml b/steam-gift-manager/docker-compose.yml index d4ad381..0840c1d 100644 --- a/steam-gift-manager/docker-compose.yml +++ b/steam-gift-manager/docker-compose.yml @@ -8,7 +8,8 @@ services: - TZ= volumes: - ../data:/app/data - - ../translations:/app/translations + - ./translations:/app/translations:rw - ../.env:/app/.env - user: "1000:1000" + user: "0:" restart: unless-stopped + diff --git a/steam-gift-manager/requirements.txt b/steam-gift-manager/requirements.txt index b909030..01baa3b 100644 --- a/steam-gift-manager/requirements.txt +++ b/steam-gift-manager/requirements.txt @@ -5,13 +5,12 @@ flask-migrate werkzeug python-dotenv flask-sqlalchemy -flask-babel jinja2<3.1.0 itsdangerous sqlalchemy apscheduler -matrix-client reportlab requests pillow gunicorn +apprise diff --git a/steam-gift-manager/static/forgejo.svg b/steam-gift-manager/static/forgejo.svg deleted file mode 100644 index 804b05e..0000000 --- a/steam-gift-manager/static/forgejo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/steam-gift-manager/static/forgejo.webp b/steam-gift-manager/static/forgejo.webp deleted file mode 100644 index 34d45aa0a128d943e8deb336a49f9c7f0552aa14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 740 zcmVJAdrK`*`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 diff --git a/steam-gift-manager/static/gog_logo.png b/steam-gift-manager/static/gog_logo.png deleted file mode 100644 index f05c3360b58523b00fd7393912a5eb0a45bbcc44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69873 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

TgCH%4G#VfXz`ukNHWf~U9f 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 z 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

~kw|&*)X6wB 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 diff --git a/steam-gift-manager/static/gog_logo.webp b/steam-gift-manager/static/gog_logo.webp deleted file mode 100644 index ce9a8a91ca386dc0bfec87ec1d5d62238320e4d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6938 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 diff --git a/steam-gift-manager/static/logo.png b/steam-gift-manager/static/logo.png deleted file mode 100644 index 1e09159088eb73bc0319f5dc9c232df4f8e51ae5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53171 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

1(G^SURml)3a#pDY$g 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 Ihdz7tKT9%R5C8xG diff --git a/steam-gift-manager/static/logo.webp b/steam-gift-manager/static/logo.webp deleted file mode 100644 index 7196e01013487bee760e66109767e468d8b8aaf8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8326 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 QFkP3fv;Y7A000000GGLeSO5S3 diff --git a/steam-gift-manager/static/logo_small.png b/steam-gift-manager/static/logo_small.png deleted file mode 100644 index 5db0156c23f09b6f61589be0f7658adb75622ad3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35514 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 MYCh4ZQMZfvA3M-?uK)l5 diff --git a/steam-gift-manager/static/logo_small_maskable.webp b/steam-gift-manager/static/logo_small_maskable.webp deleted file mode 100644 index 8ac87ad7a660bbeb987502e34e55d8612ba76759..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2568 zcmV+j3itI=Nk&Eh3IG6CMM6+kP&gp;2><}_EC8JWDu4ih06tM9k3}P*ArnkZd^iOJ zu>fk=IY+)r)#vgaM7t)6Cw93l^*8!+{)f14>c>rAGoEW->OW&qxFmRV)PvS zi1g_8V4rcz|E9gS<#?C z`se%)?%wME*!d^=ga0SEPx8;~-}XBf`X>IjGUC#io@e%e?dWxoYkJBcpUgb1v6O?Z zKen+Gtv$Y zJ^>E6RttpX?8CUoqZ688_4|inN0h$(J>uq0b>}QYS^0MU8D0W#E-!46S=gGocW^$aR?Fpln^1-8@u( zCa&+@E;=+>RV}w~(nm)j_kQbg?cxO$i>@sxnVB04GbKE}dOLyHe6^vY2o$ z@M&h7nCXa|7xR%Q6`@C;*l7osw}jCQ7H87Z;Hk2$ z9aa2qy;_>jUf2v=D9|W4w08deD?7-Z|2N!TasDnd&OGl39Q!3nBl%A8T`ay1C1B6X zTbR#PdZ-$c*Fl2WCiMsTPN><$N7H|3ohu*z+HoH@r=ds? zJVpV9jmrMy_)>FmEr3u^vz+woneg2Sgy)?Z68u&WGBy!s-!BM+@N&*gaLt_DKJ$VQ z^A=?7c6{xurH)e6G6bL(X}*Ay^luzDN2EWijW;=|efx_6@SdbSCv|d z0KyK)gao9{e3lqwdTPZ=9q)Q(m>LxJW2Z#k4A$a3;clH#k-8QQPuZuc=+t&t|DpWy zwpH|Q^C)_Q*D`Ug#;CrmXb1!pBM91IiVTrWr&Z5zW>RLxx@8C)!^p8B5Kh0+ylR~L zG`k^2*Q~5h<32lN8T6upfpsVA|NesyI}js zTz_CKFl#q`k=UJnl(GIf|7}yHe4QMvy9w*J@elt(V4kKajtP zUxW-c*AcOM#cb?@9cW4pWTh902`t94T&KG|RN8*NY4NSBV*)T?EeZnczWs!X`)Qqhhf8ulY z!}+0Up@t54qM^KDb=p&u|^r(GGV^3rf?8XSYll=Svm=f+^VutW1%=lb*@);>U|u zP~Gr8$9=c%N4uM_EYbRXzB^yQQhB12q|G5^L zmBfTqJByS>!Rn|!@Z)bVrDuJy=)Sh+VOK-eI|4im8PoUQH`7YKQWT6LPwQf0fpB~7 zQB7^4wC!XWo)>FLEE3&26x&!)D%JZaDxROd3@??2{-eclBBwBj3mnx#lh8(?W@g{+ zB@4F9^v?Q~Am~`aq;!A=<-IbV z!2?aUo;e#T7dLrp#0nX5U)$-*I;A}qH&(c#TimKV^IV<|K<4Tv+6V2^h3KmyGKfgy z(uuxxKVbRbf0^CQ_I|gCzL*Abyn&$M)qWI{^V5ckhNDXkqCLpBlQn(WR};aSHf*o0 zAm#mb@owafd;GY=M#?EgPmj%4r-PcK5!Grh0f}ziYUgMcCi5p{CxRh{vXY<-@;?kc zwgogb8SfQCXkVKPkx&3b*i37%axMo`r$g%MVAXozoH8^z9=xZz%Orwn=+9Ww!bfEZ ejB~B|G1Trt0sw83$}HK3M%cg!0*Y$@0000%9}qYI diff --git a/steam-gift-manager/static/manifest.json b/steam-gift-manager/static/manifest.json new file mode 100644 index 0000000..56e7189 --- /dev/null +++ b/steam-gift-manager/static/manifest.json @@ -0,0 +1,34 @@ +{ + "id": "/", + "name": "Game Key Manager", + "short_name": "GameKeys", + "start_url": "/", + "display": "standalone", + "background_color": "#212529", + "theme_color": "#212529", + "description": "Manage Steam/GOG keys easily!", + "orientation": "any", + "launch_handler": { + "client_mode": "navigate-existing" + }, + "icons": [ + { + "src": "/static/logo_small.webp", + "sizes": "192x192", + "type": "image/webp", + "purpose": "any" + }, + { + "src": "/static/logo_small_maskable.webp", + "sizes": "192x192", + "type": "image/webp", + "purpose": "maskable" + }, + { + "src": "/static/logo.webp", + "sizes": "512x512", + "type": "image/webp", + "purpose": "any maskable" + } + ] +} diff --git a/steam-gift-manager/static/serviceworker.js b/steam-gift-manager/static/serviceworker.js new file mode 100644 index 0000000..4fc266b --- /dev/null +++ b/steam-gift-manager/static/serviceworker.js @@ -0,0 +1,32 @@ +const CACHE_NAME = 'game-key-manager-v2'; +const ASSETS = [ + '/', + '/static/style.css', + '/static/logo.webp', + '/static/logo_small.webp', + '/static/gog_logo.webp', + '/static/forgejo.webp' +]; + +self.addEventListener('install', (event) => { + event.waitUntil( + caches.open(CACHE_NAME) + .then(cache => cache.addAll(ASSETS)) + ); +}); + +self.addEventListener('fetch', (event) => { + event.respondWith( + caches.match(event.request) + .then(cachedResponse => cachedResponse || fetch(event.request)) + ); +}); + +self.addEventListener('activate', (event) => { + event.waitUntil( + caches.keys().then(keys => Promise.all( + keys.filter(key => key !== CACHE_NAME) + .map(key => caches.delete(key)) + )) + ); +}); diff --git a/steam-gift-manager/static/style.css b/steam-gift-manager/static/style.css index e8c608f..c056d1d 100644 --- a/steam-gift-manager/static/style.css +++ b/steam-gift-manager/static/style.css @@ -60,3 +60,76 @@ body { .table-pdf td, .table-pdf th { padding: 4px 8px; } + +.badge.bg-warning { + background-color: #ffcc00 !important; + color: #222 !important; +} +.badge.bg-success { + background-color: #198754 !important; + color: #fff !important; +} + + +.game-cover { + width: 368px; + height: 172px; + max-width: 100%; + max-height: 35vw; + object-fit: contain; + background: #222; + border-radius: 8px; + display: block; + margin: 0 auto; + transition: width 0.2s, height 0.2s; +} + +/* Responsive Cover Images */ +.game-cover { + width: 368px; + height: 172px; + object-fit: contain; + background: #222; + border-radius: 6px; +} + +@media (max-width: 1200px) { + .game-cover { + width: 260px; + height: 122px; + } +} + +@media (max-width: 992px) { + .game-cover { + width: 180px; + height: 84px; + } +} + +@media (max-width: 768px) { + .game-cover { + width: 120px; + height: 56px; + } +} + +@media (max-width: 576px) { + .game-cover { + width: 90px; + height: 42px; + } +} + +/* Accessibility Improvements */ +.visually-hidden { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} + diff --git a/steam-gift-manager/templates/add_game.html b/steam-gift-manager/templates/add_game.html index 081aeaa..65ad86c 100644 --- a/steam-gift-manager/templates/add_game.html +++ b/steam-gift-manager/templates/add_game.html @@ -2,40 +2,44 @@ {% block content %}

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

-
- + +
- - + +
- - + +
- -
- - + +
- - + + +
+
+ + +
+
+ +
- - -
-
- - + +
{% include "footer.html" %} diff --git a/steam-gift-manager/templates/change_password.html b/steam-gift-manager/templates/change_password.html index 7d6943c..ca3f406 100644 --- a/steam-gift-manager/templates/change_password.html +++ b/steam-gift-manager/templates/change_password.html @@ -1,22 +1,28 @@ {% extends "base.html" %} {% block content %} -
-

{{ _('Change Password') }}

-
+
+
+
+

{{ _('Change Password') }}

+
- - + +
- - + +
- - + +
- + {{ _('Cancel') }} + +
+
{% endblock %} + diff --git a/steam-gift-manager/templates/edit_game.html b/steam-gift-manager/templates/edit_game.html index 63e5384..81db0bd 100644 --- a/steam-gift-manager/templates/edit_game.html +++ b/steam-gift-manager/templates/edit_game.html @@ -1,66 +1,67 @@ {% extends "base.html" %} {% block content %}
-

{{ _('Edit Game') }}

-
- -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- {% if redeem_url and active_redeem %} -
- - - - {{ _('Expires at') }}: {{ active_redeem.expires.strftime('%d.%m.%Y %H:%M') }} - -
- {% endif %} -
-
- - {{ _('Cancel') }} -
+

{{ _('Edit Game') }}

+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ {% if redeem_url and active_redeem %} +
+ + + + {{ _('Expires at') }}: {{ active_redeem.expires.strftime('%d.%m.%Y %H:%M') }} +
- + {% endif %} +
+
+ + {{ _('Cancel') }} +
+
+
{% endblock %} diff --git a/steam-gift-manager/templates/footer.html b/steam-gift-manager/templates/footer.html index 4f0d5fa..fdf3d9f 100644 --- a/steam-gift-manager/templates/footer.html +++ b/steam-gift-manager/templates/footer.html @@ -5,7 +5,7 @@
diff --git a/steam-gift-manager/templates/import.html b/steam-gift-manager/templates/import.html index 9abcc22..79dc283 100644 --- a/steam-gift-manager/templates/import.html +++ b/steam-gift-manager/templates/import.html @@ -5,11 +5,11 @@
- +
- - {{ _('Abbrechen') }} + + {{ _('Cancel') }}
{% endblock %} diff --git a/steam-gift-manager/templates/index.html b/steam-gift-manager/templates/index.html index ff6b87b..f9398a1 100644 --- a/steam-gift-manager/templates/index.html +++ b/steam-gift-manager/templates/index.html @@ -31,7 +31,19 @@ {% if game.steam_appid %} Steam Header + alt="Steam Header" + class="game-cover" + {% if loop.first %}fetchpriority="high"{% endif %} + width="368" + height="172" + loading="lazy"> + {% elif game.url and 'gog.com' in game.url %} + GOG Logo {% endif %} {{ game.name }} diff --git a/steam-gift-manager/templates/login.html b/steam-gift-manager/templates/login.html index 0003326..0c0ccb7 100644 --- a/steam-gift-manager/templates/login.html +++ b/steam-gift-manager/templates/login.html @@ -1,29 +1,43 @@ {% extends "base.html" %} {% block content %} -
-
-
-
- Logo -

{{ _('Login') }}

-
- -
- - -
-
- - -
- -
- -
-
+
+
+

{{ _('Login') }}

+
+ +
+ + +
+
+ + +
+ {% if error %} + + {% endif %} + +
+ +
{% endblock %} + diff --git a/steam-gift-manager/templates/register.html b/steam-gift-manager/templates/register.html index 40d6d62..b9b7ee0 100644 --- a/steam-gift-manager/templates/register.html +++ b/steam-gift-manager/templates/register.html @@ -1,24 +1,51 @@ {% extends "base.html" %} {% block content %} -
-
-
-
-

{{ _('Register') }}

-
- -
- - -
-
- - -
- -
-
-
+
+
+

{{ _('Register') }}

+
+ +
+ + +
+
+ + +
+
+ + +
+ {% if error %} + + {% endif %} + +
+ +
{% endblock %} + diff --git a/steam-gift-manager/translations/de.json b/steam-gift-manager/translations/de.json new file mode 100644 index 0000000..0f3b89d --- /dev/null +++ b/steam-gift-manager/translations/de.json @@ -0,0 +1,71 @@ +{ + "": "", + "Actions": "Aktionen", + "Active Redeem Link": "Aktiver Einlöse-Link", + "Add New Game": "Neues Spiel hinzufügen", + "Already have an account? Login!": "", + "Cancel": "Abbrechen", + "Change Password": "Passwort ändern", + "Change password form": "", + "Changes saved!": "Änderungen gespeichert!", + "Confirm New Password": "Neues Passwort bestätigen", + "Confirm Password": "", + "Cover": "Cover", + "Created": "Erstellt", + "Current Password": "Aktuelles Passwort", + "Current passwort is wrong": "Aktuelles Passwort ist falsch", + "Dark Mode": "Dunkler Modus", + "Edit Game": "Spiel bearbeiten", + "Error generating link": "Fehler beim Generieren des Links", + "Error: ": "Fehler: ", + "Expires at": "Ablaufdatum", + "Export CSV": "CSV exportieren", + "Game Key": "Spiele-Key", + "Game Key Manager": "Game-Key-Verwaltung", + "Game List (without Keys)": "Spieleliste (ohne Keys)", + "Game added successfully!": "Spiel erfolgreich hinzugefügt!", + "Generate redeem link": "Einlöse-Link generieren", + "Gifted": "Verschenkt", + "Import": "Importieren", + "Import CSV": "CSV importieren", + "Import Games": "Spiele importieren", + "Import error: %(error)s', error=str(e)), 'danger": "", + "Invalid credentials": "Ungültige Anmeldedaten", + "Key": "Key", + "Login": "Anmelden", + "Login form": "", + "Logout": "Abmelden", + "My Games": "Meine Spiele", + "Name": "Name", + "New Password": "Neues Passwort", + "New Passwords are not matching": "Neue Passwörter stimmen nicht überein", + "No account? Register here!": "", + "No games yet": "Der Kornspeicher ist leer, Sire!", + "No new registrations. They are deactivated!": "Keine neuen Registrierungen. Sie sind deaktiviert!", + "Not redeemed": "Nicht eingelöst", + "Notes": "Notizen", + "Password": "Passwort", + "Password changed successfully": "Passwort erfolgreich geändert", + "Please upload a valid CSV file.": "Bitte eine gültige CSV-Datei hochladen.", + "Really delete?": "Wirklich löschen?", + "Recipient": "Empfänger", + "Redeem by": "Einzulösen vor", + "Redeem link copied to clipboard!": "Einlöse-Link in die Zwischenablage kopiert!", + "Redeem now on": "Jetzt einlösen bei", + "Redeemed": "Eingelöst", + "Register": "Registrieren", + "Registration form": "", + "Save": "Speichern", + "Search": "Suche", + "Search games": "", + "Select CSV file": "CSV-Datei auswählen", + "Shop": "Shop", + "Shop URL": "Shop-URL", + "Status": "Status", + "Steam AppID (optional)": "Steam-AppID (optional)", + "Steam Key already exists!": "Steam-Key existiert bereits!", + "This page will expire in": "Diese Seite läuft ab in", + "Username": "Benutzername", + "Username already exists": "Benutzername existiert bereits", + "Your Key:": "Dein Key:" +} diff --git a/steam-gift-manager/translations/en.json b/steam-gift-manager/translations/en.json new file mode 100644 index 0000000..243f316 --- /dev/null +++ b/steam-gift-manager/translations/en.json @@ -0,0 +1,72 @@ +{ + "": "", + "Actions": "", + "Active Redeem Link": "", + "Add New Game": "", + "Already have an account? Login!": "", + "Cancel": "", + "Change Password": "", + "Change password form": "", + "Changes saved!": "", + "Confirm New Password": "", + "Confirm Password": "", + "Cover": "", + "Created": "", + "Current Password": "", + "Current passwort is wrong": "", + "Dark Mode": "", + "Edit Game": "", + "Error: ": "", + "Error generating link": "", + "Expires at": "", + "Export CSV": "", + "Game added successfully!": "", + "Game Key": "", + "Game Key Manager": "", + "Game List (without Keys)": "", + "Generate redeem link": "", + "Gifted": "", + "Import": "", + "Import CSV": "", + "Import error: %(error)s', error=str(e)), 'danger": "", + "Import Games": "", + "Invalid credentials": "", + "Key": "", + "Login": "", + "Login form": "", + "Logout": "", + "My Games": "", + "Name": "", + "%(new)d new games imported, %(dup)d skipped duplicates', new=new_games, dup=duplicates), 'success": "", + "New Password": "", + "New Passwords are not matching": "", + "No account? Register here!": "", + "No games yet": "", + "No new registrations. They are deactivated!": "", + "Notes": "", + "Not redeemed": "", + "Password": "", + "Password changed successfully": "", + "Please upload a valid CSV file.": "", + "Really delete?": "", + "Recipient": "", + "Redeem by": "", + "Redeemed": "", + "Redeem link copied to clipboard!": "", + "Redeem now on": "", + "Register": "", + "Registration form": "", + "Save": "", + "Search": "", + "Search games": "", + "Select CSV file": "", + "Shop": "", + "Shop URL": "", + "Status": "", + "Steam AppID (optional)": "", + "Steam Key already exists!": "", + "This page will expire in": "", + "Username": "", + "Username already exists": "", + "Your Key:": "" +} diff --git a/translate.sh b/translate.sh index 75e21e4..65b52bb 100755 --- a/translate.sh +++ b/translate.sh @@ -1,28 +1,41 @@ #!/bin/bash set -e -cd "$(dirname "$0")/steam-gift-manager" +APP_DIR="steam-gift-manager" +TRANSLATION_DIR="$APP_DIR/translations" +LANGS=("de" "en") -declare -A locales=( - ["de"]="de" - ["en"]="en" -) +# Prüfe jq +if ! command -v jq &>/dev/null; then + echo "❌ jq is required. Install with: sudo apt-get install jq" + exit 1 +fi -# create POT-file -docker-compose exec steam-manager pybabel extract -F babel.cfg -o translations/messages.pot . - -# Check for each language and initialize if necessary -for lang in "${!locales[@]}"; do - if [ ! -f "translations/${locales[$lang]}/LC_MESSAGES/messages.po" ]; then - docker-compose exec steam-manager pybabel init \ - -i translations/messages.pot \ - -d translations \ - -l "${locales[$lang]}" +# 1. Lege JSON-Dateien an, falls sie fehlen +for lang in "${LANGS[@]}"; do + file="$TRANSLATION_DIR/$lang.json" + if [ ! -f "$file" ]; then + echo "{}" > "$file" + echo "Created $file" fi done -# Update and compile translations -docker-compose exec steam-manager pybabel update -i translations/messages.pot -d translations -docker-compose exec steam-manager pybabel compile -d translations +# 2. Extrahiere alle zu übersetzenden Strings +STRINGS=$(grep -rhoP "_\(\s*['\"](.+?)['\"]\s*\)" \ + "$APP_DIR/templates" "$APP_DIR/app.py" | \ + sed -E "s/_\(\s*['\"](.+?)['\"]\s*\)/\1/" | sort | uniq) -echo "✅ Translations updated!" +# 3. Ergänze neue Keys in die JSON-Dateien +for lang in "${LANGS[@]}"; do + file="$TRANSLATION_DIR/$lang.json" + tmp="$file.tmp" + cp "$file" "$tmp" + while IFS= read -r key; do + if ! jq -e --arg k "$key" 'has($k)' "$tmp" >/dev/null; then + jq --arg k "$key" '. + {($k): ""}' "$tmp" > "$tmp.new" && mv "$tmp.new" "$tmp" + fi + done <<< "$STRINGS" + mv "$tmp" "$file" + echo "Updated $file" +done +echo "✅ JSON translation files updated. Please enter your translations!" diff --git a/translations/de/LC_MESSAGES/messages.mo b/translations/de/LC_MESSAGES/messages.mo deleted file mode 100644 index 7eaa6c97d27502ea931a9ad812d2656a72762c08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 481 zcmZuuO;5r=6s*RB>Cv-?=S`!FP$6QWgs(!-7MfDIFYu@}Ww+TbMt+4S|C&dCi?5Q1 zCQdThd7H`3%k1aL(Yrx7B%Ttlis2WUq>qUX@$JAc26URl57NevuMr+_YXnL@<3h91 zlFd-%i4-;j;pE=!MKE*2>1Z-GL(HVo%+KRw$-0|3XOXnQ^*bZ4-Rbv3cRDqLNyK^z zxuzFbpKG+iDqA&Ht}^QmDmA-yb6F;kk%jn@6iNU3s@Bfu@m#Y=agnE7OJ&30(eq&3 z@m*;CiEf!57x9M26uHEofknvI#SJt)ubn0(sp6Iyq#MOkHjrwa+aR*MHtg8!F2aEUjn{`)&Kwi diff --git a/translations/de/LC_MESSAGES/messages.po b/translations/de/LC_MESSAGES/messages.po deleted file mode 100644 index aa6b016..0000000 --- a/translations/de/LC_MESSAGES/messages.po +++ /dev/null @@ -1,274 +0,0 @@ -# German translations for PROJECT. -# Copyright (C) 2025 ORGANIZATION -# This file is distributed under the same license as the PROJECT project. -# FIRST AUTHOR , 2025. -# -msgid "" -msgstr "" -"Project-Id-Version: PROJECT VERSION\n" -"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2025-04-29 15:53+0000\n" -"PO-Revision-Date: 2025-04-29 15:42+0000\n" -"Last-Translator: FULL NAME \n" -"Language: de\n" -"Language-Team: de \n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.17.0\n" - -#: app.py:194 -msgid "Invalid credentials" -msgstr "Ungültige Anmeldedaten" - -#: app.py:200 -msgid "No new registrations. They are deactivated!" -msgstr "Keine neuen Registrierungen. Sie sind deaktiviert!" - -#: app.py:208 -msgid "Username already exists" -msgstr "Benutzername existiert bereits" - -#: app.py:234 -msgid "Current passwort is wrong" -msgstr "Aktuelles Passwort ist falsch" - -#: app.py:238 -msgid "New Passwords are not matching" -msgstr "Neue Passwörter stimmen nicht überein" - -#: app.py:243 -msgid "Password changed successfully" -msgstr "Passwort erfolgreich geändert" - -#: app.py:273 -msgid "Game added successfully!" -msgstr "Spiel erfolgreich hinzugefügt!" - -#: app.py:278 -msgid "Steam Key already exists!" -msgstr "Steam-Key existiert bereits!" - -#: app.py:281 app.py:325 -msgid "Error: " -msgstr "Fehler: " - -#: app.py:320 -msgid "Changes saved!" -msgstr "Änderungen gespeichert!" - -#: app.py:408 -msgid "Game List (without Keys)" -msgstr "Spieleliste (ohne Keys)" - -#: app.py:501 -#, python-format -msgid "%(new)d new games imported, %(dup)d skipped duplicates" -msgstr "%(new)d neue Spiele importiert, %(dup)d Duplikate übersprungen" - -#: app.py:505 -#, python-format -msgid "Import error: %(error)s" -msgstr "Importfehler: %(error)s" - -#: app.py:509 -msgid "Please upload a valid CSV file." -msgstr "Bitte eine gültige CSV-Datei hochladen." - -#: templates/add_game.html:4 templates/index.html:9 -msgid "Add New Game" -msgstr "Neues Spiel hinzufügen" - -#: templates/add_game.html:9 templates/edit_game.html:9 templates/index.html:19 -msgid "Name" -msgstr "Name" - -#: templates/add_game.html:13 templates/edit_game.html:13 -msgid "Game Key" -msgstr "Spiele-Key" - -#: templates/add_game.html:17 templates/edit_game.html:21 templates/index.html:21 -msgid "Status" -msgstr "Status" - -#: templates/add_game.html:19 templates/edit_game.html:23 templates/index.html:41 -msgid "Not redeemed" -msgstr "Nicht eingelöst" - -#: templates/add_game.html:20 templates/edit_game.html:24 templates/index.html:43 -msgid "Gifted" -msgstr "Verschenkt" - -#: templates/add_game.html:21 templates/edit_game.html:25 templates/index.html:45 -msgid "Redeemed" -msgstr "Eingelöst" - -#: templates/add_game.html:25 templates/edit_game.html:29 templates/index.html:23 -msgid "Redeem by" -msgstr "Einzulösen bis" - -#: templates/add_game.html:29 templates/edit_game.html:33 -msgid "Recipient" -msgstr "Empfänger" - -#: templates/add_game.html:33 templates/edit_game.html:37 -msgid "Shop URL" -msgstr "Shop-URL" - -#: templates/add_game.html:37 templates/edit_game.html:41 -msgid "Notes" -msgstr "Notizen" - -#: templates/add_game.html:41 templates/edit_game.html:60 -msgid "Save" -msgstr "Speichern" - -#: templates/add_game.html:42 templates/edit_game.html:61 templates/import.html:12 -msgid "Cancel" -msgstr "Abbrechen" - -#: templates/base.html:7 -msgid "Game Key Manager" -msgstr "Game-Key-Verwaltung" - -#: templates/base.html:23 -msgid "Search" -msgstr "Suche" - -#: templates/base.html:31 -msgid "Dark Mode" -msgstr "Dunkler Modus" - -#: templates/base.html:46 templates/login.html:16 templates/register.html:15 -msgid "Password" -msgstr "Passwort" - -#: templates/base.html:49 -msgid "Logout" -msgstr "Abmelden" - -#: templates/change_password.html:4 templates/change_password.html:19 -msgid "Change Password" -msgstr "Passwort ändern" - -#: templates/change_password.html:8 -msgid "Current Password" -msgstr "Aktuelles Passwort" - -#: templates/change_password.html:12 -msgid "New Password" -msgstr "Neues Passwort" - -#: templates/change_password.html:16 -msgid "Confirm New Password" -msgstr "Neues Passwort bestätigen" - -#: templates/edit_game.html:4 -msgid "Edit Game" -msgstr "Spiel bearbeiten" - -#: templates/edit_game.html:17 -msgid "Steam AppID (optional)" -msgstr "Steam-AppID (optional)" - -#: templates/edit_game.html:47 -msgid "Active Redeem Link" -msgstr "Aktiver Einlöse-Link" - -#: templates/edit_game.html:54 -msgid "Expires at" -msgstr "Ablaufdatum" - -#: templates/import.html:4 -msgid "Import Games" -msgstr "Spiele importieren" - -#: templates/import.html:8 -msgid "Select CSV file" -msgstr "CSV-Datei auswählen" - -#: templates/import.html:11 -msgid "Import" -msgstr "Importieren" - -#: templates/index.html:4 -msgid "My Games" -msgstr "Meine Spiele" - -#: templates/index.html:6 -msgid "Export CSV" -msgstr "CSV exportieren" - -#: templates/index.html:8 -msgid "Import CSV" -msgstr "CSV importieren" - -#: templates/index.html:18 -msgid "Cover" -msgstr "Cover" - -#: templates/index.html:20 -msgid "Key" -msgstr "Key" - -#: templates/index.html:22 -msgid "Created" -msgstr "Erstellt" - -#: templates/index.html:24 templates/index.html:56 -msgid "Shop" -msgstr "Shop" - -#: templates/index.html:25 -msgid "Actions" -msgstr "Aktionen" - -#: templates/index.html:63 -msgid "Generate redeem link" -msgstr "Einlöse-Link generieren" - -#: templates/index.html:70 -msgid "Really delete?" -msgstr "Wirklich löschen?" - -#: templates/index.html:96 -msgid "Redeem link copied to clipboard!" -msgstr "Einlöse-Link in die Zwischenablage kopiert!" - -#: templates/index.html:100 -msgid "Error generating link" -msgstr "Fehler beim Generieren des Links" - -#: templates/index.html:106 -msgid "No games yet" -msgstr "Der Kornspeicher ist leer, Sire!" - -#: templates/login.html:8 templates/login.html:19 -msgid "Login" -msgstr "Anmelden" - -#: templates/login.html:12 templates/register.html:11 -msgid "Username" -msgstr "Benutzername" - -#: templates/login.html:22 -msgid "No account yet? Register" -msgstr "Noch kein Konto? Jetzt registrieren" - -#: templates/redeem.html:16 -msgid "Your Key:" -msgstr "Dein Key:" - -#: templates/redeem.html:22 -msgid "Redeem now on" -msgstr "Jetzt einlösen bei" - -#: templates/redeem.html:26 -msgid "This page will expire in" -msgstr "Diese Seite läuft ab in" - -#: templates/register.html:7 templates/register.html:18 -msgid "Register" -msgstr "Registrieren" - diff --git a/translations/en/LC_MESSAGES/messages.mo b/translations/en/LC_MESSAGES/messages.mo deleted file mode 100644 index 2cb42161b7adec2c3cc9425bc5380598264dbbb5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 445 zcmZutO;5r=5XHn(kDfh@i3g1i(h3n5O86?KriG?d?h7onrtCJmTO+^1lYh_O;#LyT z#FtDmZ{}s*C^)#d_@sb&P6hSS1E6PdsaYsTGG^5GX6s_ zVRTzfpc@4JJgW>j#Wz*1(}8{KUT`>b!M^NRp&xpOOze8Y8VRl$ zH(%`vsZ>n6rQTrspsT*$Fo_;tiFL+P0_|m{tp~=LG!dCFcLauX N$#QV&_MNe)eF2WMek1?@ diff --git a/translations/en/LC_MESSAGES/messages.po b/translations/en/LC_MESSAGES/messages.po deleted file mode 100644 index e7a3a4e..0000000 --- a/translations/en/LC_MESSAGES/messages.po +++ /dev/null @@ -1,280 +0,0 @@ -# English translations for PROJECT. -# Copyright (C) 2025 ORGANIZATION -# This file is distributed under the same license as the PROJECT project. -# FIRST AUTHOR , 2025. -# -msgid "" -msgstr "" -"Project-Id-Version: PROJECT VERSION\n" -"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2025-04-29 15:53+0000\n" -"PO-Revision-Date: 2025-04-29 15:42+0000\n" -"Last-Translator: FULL NAME \n" -"Language: en\n" -"Language-Team: en \n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.17.0\n" - -#: app.py:194 -msgid "Invalid credentials" -msgstr "" - -#: app.py:200 -msgid "No new registrations. They are deactivated!" -msgstr "" - -#: app.py:208 -msgid "Username already exists" -msgstr "" - -#: app.py:234 -msgid "Current passwort is wrong" -msgstr "" - -#: app.py:238 -msgid "New Passwords are not matching" -msgstr "" - -#: app.py:243 -msgid "Password changed successfully" -msgstr "" - -#: app.py:273 -msgid "Game added successfully!" -msgstr "" - -#: app.py:278 -msgid "Steam Key already exists!" -msgstr "" - -#: app.py:281 app.py:325 -msgid "Error: " -msgstr "" - -#: app.py:320 -msgid "Changes saved!" -msgstr "" - -#: app.py:408 -msgid "Game List (without Keys)" -msgstr "" - -#: app.py:501 -#, python-format -msgid "%(new)d new games imported, %(dup)d skipped duplicates" -msgstr "" - -#: app.py:505 -#, python-format -msgid "Import error: %(error)s" -msgstr "" - -#: app.py:509 -msgid "Please upload a valid CSV file." -msgstr "" - -#: templates/add_game.html:4 templates/index.html:9 -msgid "Add New Game" -msgstr "" - -#: templates/add_game.html:9 templates/edit_game.html:9 templates/index.html:19 -msgid "Name" -msgstr "" - -#: templates/add_game.html:13 templates/edit_game.html:13 -msgid "Game Key" -msgstr "" - -#: templates/add_game.html:17 templates/edit_game.html:21 -#: templates/index.html:21 -msgid "Status" -msgstr "" - -#: templates/add_game.html:19 templates/edit_game.html:23 -#: templates/index.html:41 -msgid "Not redeemed" -msgstr "" - -#: templates/add_game.html:20 templates/edit_game.html:24 -#: templates/index.html:43 -msgid "Gifted" -msgstr "" - -#: templates/add_game.html:21 templates/edit_game.html:25 -#: templates/index.html:45 -msgid "Redeemed" -msgstr "" - -#: templates/add_game.html:25 templates/edit_game.html:29 -#: templates/index.html:23 -msgid "Redeem by" -msgstr "" - -#: templates/add_game.html:29 templates/edit_game.html:33 -msgid "Recipient" -msgstr "" - -#: templates/add_game.html:33 templates/edit_game.html:37 -msgid "Shop URL" -msgstr "" - -#: templates/add_game.html:37 templates/edit_game.html:41 -msgid "Notes" -msgstr "" - -#: templates/add_game.html:41 templates/edit_game.html:60 -msgid "Save" -msgstr "" - -#: templates/add_game.html:42 templates/edit_game.html:61 -#: templates/import.html:12 -msgid "Cancel" -msgstr "" - -#: templates/base.html:7 -msgid "Game Key Manager" -msgstr "" - -#: templates/base.html:23 -msgid "Search" -msgstr "" - -#: templates/base.html:31 -msgid "Dark Mode" -msgstr "" - -#: templates/base.html:46 templates/login.html:16 templates/register.html:15 -msgid "Password" -msgstr "" - -#: templates/base.html:49 -msgid "Logout" -msgstr "" - -#: templates/change_password.html:4 templates/change_password.html:19 -msgid "Change Password" -msgstr "" - -#: templates/change_password.html:8 -msgid "Current Password" -msgstr "" - -#: templates/change_password.html:12 -msgid "New Password" -msgstr "" - -#: templates/change_password.html:16 -msgid "Confirm New Password" -msgstr "" - -#: templates/edit_game.html:4 -msgid "Edit Game" -msgstr "" - -#: templates/edit_game.html:17 -msgid "Steam AppID (optional)" -msgstr "" - -#: templates/edit_game.html:47 -msgid "Active Redeem Link" -msgstr "" - -#: templates/edit_game.html:54 -msgid "Expires at" -msgstr "" - -#: templates/import.html:4 -msgid "Import Games" -msgstr "" - -#: templates/import.html:8 -msgid "Select CSV file" -msgstr "" - -#: templates/import.html:11 -msgid "Import" -msgstr "" - -#: templates/index.html:4 -msgid "My Games" -msgstr "" - -#: templates/index.html:6 -msgid "Export CSV" -msgstr "" - -#: templates/index.html:8 -msgid "Import CSV" -msgstr "" - -#: templates/index.html:18 -msgid "Cover" -msgstr "" - -#: templates/index.html:20 -msgid "Key" -msgstr "" - -#: templates/index.html:22 -msgid "Created" -msgstr "" - -#: templates/index.html:24 templates/index.html:56 -msgid "Shop" -msgstr "" - -#: templates/index.html:25 -msgid "Actions" -msgstr "" - -#: templates/index.html:63 -msgid "Generate redeem link" -msgstr "" - -#: templates/index.html:70 -msgid "Really delete?" -msgstr "" - -#: templates/index.html:96 -msgid "Redeem link copied to clipboard!" -msgstr "" - -#: templates/index.html:100 -msgid "Error generating link" -msgstr "" - -#: templates/index.html:106 -msgid "No games yet" -msgstr "" - -#: templates/login.html:8 templates/login.html:19 -msgid "Login" -msgstr "" - -#: templates/login.html:12 templates/register.html:11 -msgid "Username" -msgstr "" - -#: templates/login.html:22 -msgid "No account yet? Register" -msgstr "" - -#: templates/redeem.html:16 -msgid "Your Key:" -msgstr "" - -#: templates/redeem.html:22 -msgid "Redeem now on" -msgstr "" - -#: templates/redeem.html:26 -msgid "This page will expire in" -msgstr "" - -#: templates/register.html:7 templates/register.html:18 -msgid "Register" -msgstr "" - diff --git a/translations/messages.pot b/translations/messages.pot deleted file mode 100644 index 6306a35..0000000 --- a/translations/messages.pot +++ /dev/null @@ -1,279 +0,0 @@ -# Translations template for PROJECT. -# Copyright (C) 2025 ORGANIZATION -# This file is distributed under the same license as the PROJECT project. -# FIRST AUTHOR , 2025. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PROJECT VERSION\n" -"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2025-04-29 15:53+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.17.0\n" - -#: app.py:194 -msgid "Invalid credentials" -msgstr "" - -#: app.py:200 -msgid "No new registrations. They are deactivated!" -msgstr "" - -#: app.py:208 -msgid "Username already exists" -msgstr "" - -#: app.py:234 -msgid "Current passwort is wrong" -msgstr "" - -#: app.py:238 -msgid "New Passwords are not matching" -msgstr "" - -#: app.py:243 -msgid "Password changed successfully" -msgstr "" - -#: app.py:273 -msgid "Game added successfully!" -msgstr "" - -#: app.py:278 -msgid "Steam Key already exists!" -msgstr "" - -#: app.py:281 app.py:325 -msgid "Error: " -msgstr "" - -#: app.py:320 -msgid "Changes saved!" -msgstr "" - -#: app.py:408 -msgid "Game List (without Keys)" -msgstr "" - -#: app.py:501 -#, python-format -msgid "%(new)d new games imported, %(dup)d skipped duplicates" -msgstr "" - -#: app.py:505 -#, python-format -msgid "Import error: %(error)s" -msgstr "" - -#: app.py:509 -msgid "Please upload a valid CSV file." -msgstr "" - -#: templates/add_game.html:4 templates/index.html:9 -msgid "Add New Game" -msgstr "" - -#: templates/add_game.html:9 templates/edit_game.html:9 templates/index.html:19 -msgid "Name" -msgstr "" - -#: templates/add_game.html:13 templates/edit_game.html:13 -msgid "Game Key" -msgstr "" - -#: templates/add_game.html:17 templates/edit_game.html:21 -#: templates/index.html:21 -msgid "Status" -msgstr "" - -#: templates/add_game.html:19 templates/edit_game.html:23 -#: templates/index.html:41 -msgid "Not redeemed" -msgstr "" - -#: templates/add_game.html:20 templates/edit_game.html:24 -#: templates/index.html:43 -msgid "Gifted" -msgstr "" - -#: templates/add_game.html:21 templates/edit_game.html:25 -#: templates/index.html:45 -msgid "Redeemed" -msgstr "" - -#: templates/add_game.html:25 templates/edit_game.html:29 -#: templates/index.html:23 -msgid "Redeem by" -msgstr "" - -#: templates/add_game.html:29 templates/edit_game.html:33 -msgid "Recipient" -msgstr "" - -#: templates/add_game.html:33 templates/edit_game.html:37 -msgid "Shop URL" -msgstr "" - -#: templates/add_game.html:37 templates/edit_game.html:41 -msgid "Notes" -msgstr "" - -#: templates/add_game.html:41 templates/edit_game.html:60 -msgid "Save" -msgstr "" - -#: templates/add_game.html:42 templates/edit_game.html:61 -#: templates/import.html:12 -msgid "Cancel" -msgstr "" - -#: templates/base.html:7 -msgid "Game Key Manager" -msgstr "" - -#: templates/base.html:23 -msgid "Search" -msgstr "" - -#: templates/base.html:31 -msgid "Dark Mode" -msgstr "" - -#: templates/base.html:46 templates/login.html:16 templates/register.html:15 -msgid "Password" -msgstr "" - -#: templates/base.html:49 -msgid "Logout" -msgstr "" - -#: templates/change_password.html:4 templates/change_password.html:19 -msgid "Change Password" -msgstr "" - -#: templates/change_password.html:8 -msgid "Current Password" -msgstr "" - -#: templates/change_password.html:12 -msgid "New Password" -msgstr "" - -#: templates/change_password.html:16 -msgid "Confirm New Password" -msgstr "" - -#: templates/edit_game.html:4 -msgid "Edit Game" -msgstr "" - -#: templates/edit_game.html:17 -msgid "Steam AppID (optional)" -msgstr "" - -#: templates/edit_game.html:47 -msgid "Active Redeem Link" -msgstr "" - -#: templates/edit_game.html:54 -msgid "Expires at" -msgstr "" - -#: templates/import.html:4 -msgid "Import Games" -msgstr "" - -#: templates/import.html:8 -msgid "Select CSV file" -msgstr "" - -#: templates/import.html:11 -msgid "Import" -msgstr "" - -#: templates/index.html:4 -msgid "My Games" -msgstr "" - -#: templates/index.html:6 -msgid "Export CSV" -msgstr "" - -#: templates/index.html:8 -msgid "Import CSV" -msgstr "" - -#: templates/index.html:18 -msgid "Cover" -msgstr "" - -#: templates/index.html:20 -msgid "Key" -msgstr "" - -#: templates/index.html:22 -msgid "Created" -msgstr "" - -#: templates/index.html:24 templates/index.html:56 -msgid "Shop" -msgstr "" - -#: templates/index.html:25 -msgid "Actions" -msgstr "" - -#: templates/index.html:63 -msgid "Generate redeem link" -msgstr "" - -#: templates/index.html:70 -msgid "Really delete?" -msgstr "" - -#: templates/index.html:96 -msgid "Redeem link copied to clipboard!" -msgstr "" - -#: templates/index.html:100 -msgid "Error generating link" -msgstr "" - -#: templates/index.html:106 -msgid "No games yet" -msgstr "" - -#: templates/login.html:8 templates/login.html:19 -msgid "Login" -msgstr "" - -#: templates/login.html:12 templates/register.html:11 -msgid "Username" -msgstr "" - -#: templates/login.html:22 -msgid "No account yet? Register" -msgstr "" - -#: templates/redeem.html:16 -msgid "Your Key:" -msgstr "" - -#: templates/redeem.html:22 -msgid "Redeem now on" -msgstr "" - -#: templates/redeem.html:26 -msgid "This page will expire in" -msgstr "" - -#: templates/register.html:7 templates/register.html:18 -msgid "Register" -msgstr "" - From 4d83464963d2b2e1acd5194a554a7434617be865 Mon Sep 17 00:00:00 2001 From: nocci Date: Sat, 3 May 2025 11:52:38 +0200 Subject: [PATCH 02/10] small fix in edit route --- setup.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.sh b/setup.sh index 0ef74d5..1ab9f8f 100644 --- a/setup.sh +++ b/setup.sh @@ -470,7 +470,7 @@ def edit_game(game_id): if not game or game.owner != current_user: abort(404) - if not game or game.owner != current_user: + if game.owner != current_user: abort(403) active_redeem = RedeemToken.query.filter( @@ -503,7 +503,7 @@ def edit_game(game_id): except Exception as e: db.session.rollback() - flash(_('Error: ') + str(e), 'danger') + flash(f"{translate('Error:', session.get('lang', 'en'))} {str(e)}", 'danger') return render_template('edit_game.html', game=game, From e2c218102eeb21ee7f21b6314cc5c308131dadcd Mon Sep 17 00:00:00 2001 From: nocci Date: Sat, 3 May 2025 12:26:54 +0200 Subject: [PATCH 03/10] better handling of translations --- setup.sh | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/setup.sh b/setup.sh index 1ab9f8f..cc46041 100644 --- a/setup.sh +++ b/setup.sh @@ -213,11 +213,14 @@ for lang in SUPPORTED_LANGUAGES: 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 + value = TRANSLATIONS.get('en', {}).get(key) + + value = value or key + return value.format(**kwargs) if kwargs and isinstance(value, str) else value ## DEBUG Translations @@ -352,12 +355,12 @@ 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 @@ -372,7 +375,7 @@ def login(): login_user(user) return redirect(url_for('index')) - flash(_('Invalid credentials'), 'danger') + flash(translate('Invalid credentials', session.get('lang', 'en')), 'danger') return render_template('login.html') @app.route('/register', methods=['GET', 'POST']) @@ -386,7 +389,7 @@ def register(): password = generate_password_hash(request.form['password']) if User.query.filter_by(username=username).first(): - flash(_('Username already exists'), 'danger') + flash(translate('Username already exists', session.get('lang', 'en')), 'danger') return redirect(url_for('register')) new_user = User(username=username, password=password) @@ -421,7 +424,7 @@ def 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') @@ -459,7 +462,8 @@ def add_game(): flash(_('Steam Key already exists!'), 'danger') except Exception as e: db.session.rollback() - flash(_('Error: ') + str(e), 'danger') + lang = session.get('lang', 'en') + flash(f"{translate('Error:', lang)} {str(e)}", 'danger') return render_template('add_game.html') @@ -690,7 +694,7 @@ def import_games(): except Exception as e: db.session.rollback() - flash(_('Import error: %(error)s', error=str(e)), 'danger') + flash(translate('Import error: %(error)s', session.get('lang', 'en'), error=str(e)), 'danger') return redirect(url_for('index')) @@ -781,7 +785,6 @@ def check_expiring_keys(): 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, @@ -1057,7 +1060,6 @@ cat < templates/base.html - {# LCP-Optimierung: Preload für das erste Cover-Bild, falls vorhanden #} {% if games and games[0].steam_appid %} Date: Sat, 3 May 2025 12:49:47 +0200 Subject: [PATCH 04/10] small fixes --- setup.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/setup.sh b/setup.sh index cc46041..77bca10 100644 --- a/setup.sh +++ b/setup.sh @@ -885,10 +885,10 @@ services: COMPOSE_END # 7. Directories and permissions -mkdir -p ../data ../translations -chmod -R a+rwX ../data ../translations -find ../data ../translations -type d -exec chmod 775 {} \; -find ../data ../translations -type f -exec chmod 664 {} \; +mkdir -p ../data +chmod -R a+rwX ../data +find ../data -type d -exec chmod 775 {} \; +find ../data -type f -exec chmod 664 {} \; cat <<'SCRIPT_END' > ../translate.sh #!/bin/bash From 30c06da254ece87c31c2f15c1f62881b84217665 Mon Sep 17 00:00:00 2001 From: nocci Date: Sun, 4 May 2025 14:26:04 +0200 Subject: [PATCH 05/10] bigger fixes - switched translations, build while setup runs etc., ui more responsible --- .vscode/launch.json | 21 + app.py | 0 setup.sh | 1262 +++++++++++++++++++++++++++---------------- 3 files changed, 832 insertions(+), 451 deletions(-) create mode 100644 .vscode/launch.json create mode 100644 app.py diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..b1b9d3a --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,21 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Python: Remote Attach", + "type": "python", + "request": "attach", + "connect": { + "host": "192.168.10.31", + "port": 5678 + }, + "pathMappings": [ + { + "localRoot": "${workspaceFolder}", + "remoteRoot": "." + } + ], + "justMyCode": true + } + ] +} \ No newline at end of file diff --git a/app.py b/app.py new file mode 100644 index 0000000..e69de29 diff --git a/setup.sh b/setup.sh index 77bca10..b67b392 100644 --- a/setup.sh +++ b/setup.sh @@ -87,6 +87,15 @@ chmod -R a+rwX "$TRANSLATIONS_DIR" "$DATA_DIR" cd $PROJECT_DIR +## UID/GID-Logic +#if [ "$(id -u)" -eq 0 ]; then +# export UID=1000 +# export GID=1000 +#else +# export UID=$(id -u) +# export GID=$(id -g) +#fi + # 2. requirements.txt cat < requirements.txt flask @@ -105,6 +114,8 @@ requests pillow gunicorn apprise +debugpy +pytz EOL # 3. .env Datei in Parent-Folder @@ -149,18 +160,35 @@ cd $PROJECT_DIR # 4. app.py (the main app) cat <<'PYTHON_END' > app.py -import os +import os, time +from datetime import datetime, timedelta +from zoneinfo import ZoneInfo +import pytz 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 import ( + Flask, + render_template, + request, + redirect, + url_for, + flash, + session, + abort, + send_file, + jsonify, + Markup, + make_response +) 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 +from flask_wtf import FlaskForm +from wtforms import StringField, SelectField, TextAreaField, validators import io import warnings import re @@ -172,9 +200,10 @@ from dotenv import load_dotenv load_dotenv(override=True) from sqlalchemy.exc import IntegrityError from apscheduler.schedulers.background import BackgroundScheduler +from apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStore import atexit from flask_migrate import Migrate -from sqlalchemy import MetaData +from sqlalchemy import MetaData, event from reportlab.pdfgen import canvas from reportlab.lib.pagesizes import A4, landscape, letter from reportlab.platypus import ( @@ -191,15 +220,39 @@ from reportlab.lib.utils import ImageReader from reportlab.lib.units import cm, inch, mm from io import BytesIO import reportlab.lib +import traceback import logging -logging.basicConfig() +logging.basicConfig(level=logging.INFO) +logging.getLogger('apscheduler').setLevel(logging.DEBUG) +from sqlalchemy.engine import Engine +import sqlite3 +from sqlalchemy.orm import joinedload + + +@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() + +TZ = os.getenv('TZ', 'UTC') +os.environ['TZ'] = TZ app = Flask(__name__) +# Auf UNIX-Systemen (Linux, Docker) wirksam machen +try: + time.tzset() +except AttributeError: + pass # tzset gibt es auf Windows nicht +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 = {} @@ -207,21 +260,23 @@ 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') + lang = lang or session.get('lang', 'en') + fallback_lang = app.config.get('DEFAULT_LANGUAGE', 'en') - value = TRANSLATIONS.get(lang, {}).get(key) + translations = TRANSLATIONS.get(lang, {}) + fallback_translations = TRANSLATIONS.get(fallback_lang, {}) - if value is None and lang != 'en': - value = TRANSLATIONS.get('en', {}).get(key) - - value = value or key - - return value.format(**kwargs) if kwargs and isinstance(value, str) else value + 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: @@ -248,6 +303,7 @@ app.config.update( SECRET_KEY=os.getenv('SECRET_KEY'), SQLALCHEMY_DATABASE_URI='sqlite:////app/data/games.db', SQLALCHEMY_TRACK_MODIFICATIONS=False, + SESSION_COOKIE_NAME = 'gamekeys_session', SESSION_COOKIE_SECURE=os.getenv('SESSION_COOKIE_SECURE', 'False') == 'True', SESSION_COOKIE_SAMESITE='Lax', PERMANENT_SESSION_LIFETIME=timedelta(days=30), @@ -272,51 +328,138 @@ app.logger.setLevel(logging.INFO) @app.before_request +def debug_translations(): + app.logger.debug(f"Aktuelle Sprache: {session.get('lang')}") + app.logger.debug(f"Übersetzungskeys: {list(TRANSLATIONS.get(session.get('lang', 'en'), {}).keys())}") 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: url = request.url.replace('http://', 'https://', 1) app.logger.info(f"Redirecting to HTTPS: {url}") return redirect(url, code=301) +def check_translations(): + app.logger.debug(f"Available translations: {TRANSLATIONS}") + app.logger.debug(f"Current language: {session.get('lang', 'en')}") @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': str(local_tz) + } + +@app.template_filter('strftime') +def _jinja2_filter_datetime(date, fmt='%d.%m.%Y'): + if date is None: + return '' + return date.strftime(fmt) + # DB Models -class User(db.Model, UserMixin): - __tablename__ = 'users' +class User(UserMixin, db.Model): + __tablename__ = 'users' # Expliziter Tabellenname + 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) + games = db.relationship( + 'Game', + back_populates='owner', + cascade='all, delete-orphan', + passive_deletes=True + ) + class Game(db.Model): + __tablename__ = 'games' + 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') + + # with users.id + user_id = db.Column( + db.Integer, + db.ForeignKey('users.id', ondelete='CASCADE'), # Wichtig + 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) 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 = [ + ('pc', 'PC'), + ('xbox', 'XBox'), + ('playstation', 'PlayStation'), + ('switch', 'Nintendo Switch'), + ('other', 'Andere') +] + +STATUS_CHOICES = [ + ('nicht eingelöst', 'Nicht eingelöst'), + ('eingelöst', 'Eingelöst'), + ('geschenkt', 'Geschenkt') +] + with app.app_context(): db.create_all() @@ -361,7 +504,7 @@ def set_lang(lang): @app.route('/set-theme/') def set_theme(theme): resp = make_response('', 204) - resp.set_cookie('theme', theme, max_age=60*60*24*365) + resp.set_cookie('theme', theme, max_age=60*60*24*365) # 1 Jahr Gültigkeit return resp @app.route('/login', methods=['GET', 'POST']) @@ -381,7 +524,7 @@ def login(): @app.route('/register', methods=['GET', 'POST']) def register(): if not app.config['REGISTRATION_ENABLED']: - flash(_('No new registrations. They are deactivated!'), 'danger') + flash(translate('No new registrations. They are deactivated!'), 'danger') return redirect(url_for('login')) if request.method == 'POST': @@ -415,11 +558,11 @@ 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) @@ -439,10 +582,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', ''), @@ -454,84 +602,119 @@ 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() - lang = session.get('lang', 'en') - flash(f"{translate('Error:', lang)} {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 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) - + # Validierung + 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 + existing = Game.query.filter( + Game.steam_key == request.form['steam_key'], + Game.id != game.id + ).first() + if existing: + flash(translate('Steam Key already exists'), 'error') + return redirect(url_for('edit_game', game_id=game_id)) + + # Felder aktualisieren 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', '')) + # Zeitzonen-korrekte Umwandlung + game.redeem_date_local = ( + game.redeem_date.astimezone(local_tz) + if game.redeem_date + else None + ) + + # Token-Logik + if game.status == 'geschenkt': + # Vorhandene Tokens löschen + RedeemToken.query.filter_by(game_id=game.id).delete() + + # Neuen Token generieren + 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') # Platzhalter korrigiert except Exception as e: db.session.rollback() - flash(f"{translate('Error:', session.get('lang', 'en'))} {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') # Platzhalter korrigiert + + 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')) @@ -590,7 +773,10 @@ def export_pdf(): img_height = 2*cm # Titel - elements.append(Paragraph(_("Game List (without Keys)"), styles['Title'])) + elements.append(Paragraph( + translate("Game List (without Keys)", lang=session.get('lang', 'en')), + styles['Title'] + )) elements.append(Spacer(1, 12)) # Tabellenkopf @@ -690,59 +876,60 @@ 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(translate('Import error: %(error)s', session.get('lang', 'en'), 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(): + + # Zeit in UTC umwandeln + 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) @@ -754,8 +941,10 @@ def redeem_page(token): return render_template('redeem.html', game=game, redeem_token=redeem_token, + expires_timestamp=int(expires_utc.timestamp() * 1000), # Millisekunden platform_link='https://store.steampowered.com/account/registerkey?key=' if game.steam_appid else 'https://www.gog.com/redeem') + # Apprise Notifications import apprise @@ -781,264 +970,74 @@ 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) - - 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() + +# Jobs hinzufügen +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' +) + +# Scheduler starten +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) PYTHON_END -# 5. Dockerfile -cat < Dockerfile -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 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 - - -WORKDIR /app -COPY requirements.txt . -RUN pip install --no-cache-dir -r requirements.txt - -COPY . . - -ARG UID=1000 -ARG GID=1000 -RUN groupadd -g \$GID appuser && \ - useradd -u \$UID -g \$GID -m appuser && \ - chown -R appuser:appuser /app - -USER appuser - -EXPOSE 5000 - -CMD ["gunicorn", "-b", "0.0.0.0:5000", "app:app"] -DOCKER_END - -# 6. docker-compose.yml -cat < docker-compose.yml -services: - steam-manager: - build: . - ports: - - "5000:5000" - environment: - - REGISTRATION_ENABLED=${REGISTRATION_ENABLED:-True} - - TZ=${TZ} - volumes: - - ../data:/app/data - - ./translations:/app/translations:rw - - ../.env:/app/.env - user: "${UID}:${GID}" - restart: unless-stopped - -COMPOSE_END - -# 7. Directories and permissions -mkdir -p ../data -chmod -R a+rwX ../data -find ../data -type d -exec chmod 775 {} \; -find ../data -type f -exec chmod 664 {} \; - -cat <<'SCRIPT_END' > ../translate.sh -#!/bin/bash -set -e - -APP_DIR="steam-gift-manager" -TRANSLATION_DIR="$APP_DIR/translations" -LANGS=("de" "en") - -# Prüfe jq -if ! command -v jq &>/dev/null; then - echo "❌ jq is required. Install with: sudo apt-get install jq" - exit 1 -fi - -# 1. create json files if missing -for lang in "${LANGS[@]}"; do - file="$TRANSLATION_DIR/$lang.json" - if [ ! -f "$file" ]; then - echo "{}" > "$file" - echo "Created $file" - fi -done - -# 2. Extract the strings -STRINGS=$(grep -rhoP "_\(\s*['\"](.+?)['\"]\s*\)" \ - "$APP_DIR/templates" "$APP_DIR/app.py" | \ - sed -E "s/_\(\s*['\"](.+?)['\"]\s*\)/\1/" | sort | uniq) - -# 3. add new keys into the json files -for lang in "${LANGS[@]}"; do - file="$TRANSLATION_DIR/$lang.json" - tmp="$file.tmp" - cp "$file" "$tmp" - while IFS= read -r key; do - if ! jq -e --arg k "$key" 'has($k)' "$tmp" >/dev/null; then - jq --arg k "$key" '. + {($k): ""}' "$tmp" > "$tmp.new" && mv "$tmp.new" "$tmp" - fi - done <<< "$STRINGS" - mv "$tmp" "$file" - echo "Updated $file" -done -echo "✅ JSON translation files updated. Please enter your translations!" - - - -SCRIPT_END -chmod +x ../translate.sh - -cat <<'SCRIPT_END' > ../upgrade.sh -#!/bin/bash -set -e - -# Set the working directory to the project directory -cd "$(dirname "$0")/steam-gift-manager" - -# Setze FLASK_APP, falls nötig -export FLASK_APP=app.py - -# Initialize migrations, if not yet available -if [ ! -d migrations ]; then - echo "Starting Flask-Migrate..." - docker-compose exec steam-manager flask db init -fi - -# Create migration (only if models have changed) -docker-compose exec steam-manager flask db migrate -m "Automatic Migration" - -# Apply migration -docker-compose exec steam-manager flask db upgrade - -echo "✅ Database migration completed!" -SCRIPT_END -chmod +x ../upgrade.sh - -# Manifest for PWA -cat < static/manifest.json -{ - "id": "/", - "name": "Game Key Manager", - "short_name": "GameKeys", - "start_url": "/", - "display": "standalone", - "background_color": "#212529", - "theme_color": "#212529", - "description": "Manage Steam/GOG keys easily!", - "orientation": "any", - "launch_handler": { - "client_mode": "navigate-existing" - }, - "icons": [ - { - "src": "/static/logo_small.webp", - "sizes": "192x192", - "type": "image/webp", - "purpose": "any" - }, - { - "src": "/static/logo_small_maskable.webp", - "sizes": "192x192", - "type": "image/webp", - "purpose": "maskable" - }, - { - "src": "/static/logo.webp", - "sizes": "512x512", - "type": "image/webp", - "purpose": "any maskable" - } - ] -} -MANIFEST_END - - -# Service Worker -cat < static/serviceworker.js -const CACHE_NAME = 'game-key-manager-v2'; -const ASSETS = [ - '/', - '/static/style.css', - '/static/logo.webp', - '/static/logo_small.webp', - '/static/gog_logo.webp', - '/static/forgejo.webp' -]; - -self.addEventListener('install', (event) => { - event.waitUntil( - caches.open(CACHE_NAME) - .then(cache => cache.addAll(ASSETS)) - ); -}); - -self.addEventListener('fetch', (event) => { - event.respondWith( - caches.match(event.request) - .then(cachedResponse => cachedResponse || fetch(event.request)) - ); -}); - -self.addEventListener('activate', (event) => { - event.waitUntil( - caches.keys().then(keys => Promise.all( - keys.filter(key => key !== CACHE_NAME) - .map(key => caches.delete(key)) - )) - ); -}); -SW_END - # 9. Templates mkdir -p templates static @@ -1129,12 +1128,14 @@ cat < templates/base.html
{% with messages = get_flashed_messages(with_categories=true) %} {% if messages %} - {% for category, message in messages %} -
- {{ message }} - +
+ {% for category, message in messages %} +
+ {{ message|safe }} + +
+ {% endfor %}
- {% endfor %} {% endif %} {% endwith %} {% block content %}{% endblock %} @@ -1186,7 +1187,7 @@ cat < templates/base.html HTML_END # Index Template -cat < templates/index.html +cat <<'HTML_END' > templates/index.html {% extends "base.html" %} {% block content %}
@@ -1240,16 +1241,16 @@ cat < templates/index.html {% 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 %} @@ -1258,8 +1259,9 @@ cat < templates/index.html {% endif %} - {% if game.status == 'verschenkt' %} -
-