From 1bec68df4dd62905b591f63493bb4c26ab46c6c0 Mon Sep 17 00:00:00 2001 From: massimilianodelliubaldini <8584296+massimilianodelliubaldini@users.noreply.github.com> Date: Fri, 4 Apr 2025 17:11:45 -0400 Subject: [PATCH] WebHost: Standardize some 404 redirects (#4642) --- WebHostLib/misc.py | 12 ++++++++++++ WebHostLib/options.py | 12 +++++++++--- WebHostLib/static/assets/gameInfo.js | 5 ----- WebHostLib/static/assets/tutorial.js | 5 ----- worlds/alttp/__init__.py | 1 + worlds/aquaria/__init__.py | 1 + worlds/clique/__init__.py | 1 + worlds/dlcquest/__init__.py | 1 + worlds/ffmq/__init__.py | 1 + worlds/oot/__init__.py | 1 + worlds/sc2/__init__.py | 1 + 11 files changed, 28 insertions(+), 13 deletions(-) diff --git a/WebHostLib/misc.py b/WebHostLib/misc.py index 6be0e470..98731b65 100644 --- a/WebHostLib/misc.py +++ b/WebHostLib/misc.py @@ -35,6 +35,12 @@ def start_playing(): @app.route('/games//info/') @cache.cached() def game_info(game, lang): + try: + world = AutoWorldRegister.world_types[game] + if lang not in world.web.game_info_languages: + raise KeyError("Sorry, this game's info page is not available in that language yet.") + except KeyError: + return abort(404) return render_template('gameInfo.html', game=game, lang=lang, theme=get_world_theme(game)) @@ -52,6 +58,12 @@ def games(): @app.route('/tutorial///') @cache.cached() def tutorial(game, file, lang): + try: + world = AutoWorldRegister.world_types[game] + if lang not in [tut.link.split("/")[1] for tut in world.web.tutorials]: + raise KeyError("Sorry, the tutorial is not available in that language yet.") + except KeyError: + return abort(404) return render_template("tutorial.html", game=game, file=file, lang=lang, theme=get_world_theme(game)) diff --git a/WebHostLib/options.py b/WebHostLib/options.py index 15b7bd61..711762ee 100644 --- a/WebHostLib/options.py +++ b/WebHostLib/options.py @@ -6,7 +6,7 @@ from typing import Dict, Union from docutils.core import publish_parts import yaml -from flask import redirect, render_template, request, Response +from flask import redirect, render_template, request, Response, abort import Options from Utils import local_path @@ -142,7 +142,10 @@ def weighted_options_old(): @app.route("/games//weighted-options") @cache.cached() def weighted_options(game: str): - return render_options_page("weightedOptions/weightedOptions.html", game, is_complex=True) + try: + return render_options_page("weightedOptions/weightedOptions.html", game, is_complex=True) + except KeyError: + return abort(404) @app.route("/games//generate-weighted-yaml", methods=["POST"]) @@ -197,7 +200,10 @@ def generate_weighted_yaml(game: str): @app.route("/games//player-options") @cache.cached() def player_options(game: str): - return render_options_page("playerOptions/playerOptions.html", game, is_complex=False) + try: + return render_options_page("playerOptions/playerOptions.html", game, is_complex=False) + except KeyError: + return abort(404) # YAML generator for player-options diff --git a/WebHostLib/static/assets/gameInfo.js b/WebHostLib/static/assets/gameInfo.js index b8c56905..1d6d1361 100644 --- a/WebHostLib/static/assets/gameInfo.js +++ b/WebHostLib/static/assets/gameInfo.js @@ -42,10 +42,5 @@ window.addEventListener('load', () => { scrollTarget?.scrollIntoView(); } }); - }).catch((error) => { - console.error(error); - gameInfo.innerHTML = - `

This page is out of logic!

-

Click here to return to safety.

`; }); }); diff --git a/WebHostLib/static/assets/tutorial.js b/WebHostLib/static/assets/tutorial.js index 1db08d85..d5279660 100644 --- a/WebHostLib/static/assets/tutorial.js +++ b/WebHostLib/static/assets/tutorial.js @@ -49,10 +49,5 @@ window.addEventListener('load', () => { scrollTarget?.scrollIntoView(); } }); - }).catch((error) => { - console.error(error); - tutorialWrapper.innerHTML = - `

This page is out of logic!

-

Click here to return to safety.

`; }); }); diff --git a/worlds/alttp/__init__.py b/worlds/alttp/__init__.py index b5489906..e4a04fe6 100644 --- a/worlds/alttp/__init__.py +++ b/worlds/alttp/__init__.py @@ -121,6 +121,7 @@ class ALTTPWeb(WebWorld): ) tutorials = [setup_en, setup_de, setup_es, setup_fr, msu, msu_es, msu_fr, plando, oof_sound] + game_info_languages = ["en", "fr"] class ALTTPWorld(World): diff --git a/worlds/aquaria/__init__.py b/worlds/aquaria/__init__.py index 54158b28..084d3144 100644 --- a/worlds/aquaria/__init__.py +++ b/worlds/aquaria/__init__.py @@ -41,6 +41,7 @@ class AquariaWeb(WebWorld): ) tutorials = [setup, setup_fr] + game_info_languages = ["en", "fr"] class AquariaWorld(World): diff --git a/worlds/clique/__init__.py b/worlds/clique/__init__.py index 3d06e477..70777c51 100644 --- a/worlds/clique/__init__.py +++ b/worlds/clique/__init__.py @@ -31,6 +31,7 @@ class CliqueWebWorld(WebWorld): ) tutorials = [setup_en, setup_de] + game_info_languages = ["en", "de"] class CliqueWorld(World): diff --git a/worlds/dlcquest/__init__.py b/worlds/dlcquest/__init__.py index 37eae9b4..8c495ef6 100644 --- a/worlds/dlcquest/__init__.py +++ b/worlds/dlcquest/__init__.py @@ -34,6 +34,7 @@ class DLCqwebworld(WebWorld): ["Deoxis"] ) tutorials = [setup_en, setup_fr] + game_info_languages = ["en", "fr"] class DLCqworld(World): diff --git a/worlds/ffmq/__init__.py b/worlds/ffmq/__init__.py index e80a4cf9..c749909a 100644 --- a/worlds/ffmq/__init__.py +++ b/worlds/ffmq/__init__.py @@ -43,6 +43,7 @@ class FFMQWebWorld(WebWorld): ) tutorials = [setup_en, setup_fr] + game_info_languages = ["en", "fr"] class FFMQWorld(World): diff --git a/worlds/oot/__init__.py b/worlds/oot/__init__.py index 1742ab72..136439ee 100644 --- a/worlds/oot/__init__.py +++ b/worlds/oot/__init__.py @@ -130,6 +130,7 @@ class OOTWeb(WebWorld): tutorials = [setup, setup_fr, setup_de] option_groups = oot_option_groups + game_info_languages = ["en", "de"] class OOTWorld(World): diff --git a/worlds/sc2/__init__.py b/worlds/sc2/__init__.py index ec8a447d..f11059a5 100644 --- a/worlds/sc2/__init__.py +++ b/worlds/sc2/__init__.py @@ -41,6 +41,7 @@ class Starcraft2WebWorld(WebWorld): ) tutorials = [setup_en, setup_fr] + game_info_languages = ["en", "fr"] class SC2World(World):