From 0a1261eb8419e728d3d6a8e5350645b69e090c87 Mon Sep 17 00:00:00 2001
From: Jarno <jarnowesthof@gmail.com>
Date: Fri, 17 Feb 2023 19:16:37 +0100
Subject: [PATCH] WebHost: Add tutorials to sitemap and hide settings link for
 games without settings (#1452)

* WebHost: Add tutorials to sitemap and hide settings link for games without settings

* Fixed some typing imports
---
 Utils.py                          |  7 +++++--
 WebHostLib/misc.py                |  6 ++++--
 WebHostLib/templates/siteMap.html | 17 +++++++++++++++--
 3 files changed, 24 insertions(+), 6 deletions(-)

diff --git a/Utils.py b/Utils.py
index 133f1c45..010cc3e5 100644
--- a/Utils.py
+++ b/Utils.py
@@ -12,7 +12,7 @@ import io
 import collections
 import importlib
 import logging
-from typing import BinaryIO, Coroutine, Optional, Set
+from typing import BinaryIO, Coroutine, Optional, Set, Dict, Any, Union
 
 from yaml import load, load_all, dump, SafeLoader
 
@@ -662,7 +662,10 @@ def messagebox(title: str, text: str, error: bool = False) -> None:
 
 def title_sorted(data: typing.Sequence, key=None, ignore: typing.Set = frozenset(("a", "the"))):
     """Sorts a sequence of text ignoring typical articles like "a" or "the" in the beginning."""
-    def sorter(element: str) -> str:
+    def sorter(element: Union[str, Dict[str, Any]]) -> str:
+        if (not isinstance(element, str)):
+            element = element["title"]
+
         parts = element.split(maxsplit=1)
         if parts[0].lower() in ignore:
             return parts[1].lower()
diff --git a/WebHostLib/misc.py b/WebHostLib/misc.py
index aa5467d6..bf9f4e2f 100644
--- a/WebHostLib/misc.py
+++ b/WebHostLib/misc.py
@@ -1,5 +1,6 @@
 import datetime
 import os
+from typing import List, Dict, Union
 
 import jinja2.exceptions
 from flask import request, redirect, url_for, render_template, Response, session, abort, send_from_directory
@@ -163,8 +164,9 @@ def get_datapackage():
 @app.route('/index')
 @app.route('/sitemap')
 def get_sitemap():
-    available_games = []
+    available_games: List[Dict[str, Union[str, bool]]] = []
     for game, world in AutoWorldRegister.world_types.items():
         if not world.hidden:
-            available_games.append(game)
+            has_settings: bool = isinstance(world.web.settings_page, bool) and world.web.settings_page
+            available_games.append({ 'title': game, 'has_settings': has_settings })
     return render_template("siteMap.html", games=available_games)
diff --git a/WebHostLib/templates/siteMap.html b/WebHostLib/templates/siteMap.html
index 6d1816d5..1cfb71f8 100644
--- a/WebHostLib/templates/siteMap.html
+++ b/WebHostLib/templates/siteMap.html
@@ -29,17 +29,30 @@
             <li><a href="/glossary/en">Glossary</a></li>
         </ul>
 
+        <h2>Tutorials</h2>
+        <ul>
+            <li><a href="/tutorial/Archipelago/setup/en">Multiworld Setup Tutorial</a></li>
+            <li><a href="/tutorial/Archipelago/using_website/en">Website User Guide</a></li>
+            <li><a href="/tutorial/Archipelago/mac/en">Setup Guide for Mac</a></li>
+            <li><a href="/tutorial/Archipelago/commands/en">Server and Client Commands</a></li>
+            <li><a href="/tutorial/Archipelago/advanced_settings/en">Advanced YAML Guide</a></li>
+            <li><a href="/tutorial/Archipelago/triggers/en">Triggers Guide</a></li>
+            <li><a href="/tutorial/Archipelago/plando/en">Plando Guide</a></li>
+        </ul>
+
         <h2>Game Info Pages</h2>
         <ul>
             {% for game in games | title_sorted %}
-                <li><a href="{{ url_for('game_info', game=game, lang='en') }}">{{ game }}</a></li>
+                <li><a href="{{ url_for('game_info', game=game['title'], lang='en') }}">{{ game['title'] }}</a></li>
             {% endfor %}
         </ul>
 
         <h2>Game Settings Pages</h2>
         <ul>
             {% for game in games | title_sorted %}
-                <li><a href="{{ url_for('player_settings', game=game) }}">{{ game }}</a></li>
+                {% if game['has_settings'] %}
+                    <li><a href="{{ url_for('player_settings', game=game['title']) }}">{{ game['title'] }}</a></li>
+                {% endif %} 
             {% endfor %}
         </ul>
     </div>