Core: Give clearer error message for invalid .apworld zip (#5871)

* Update messages and check

* Make "official" error message show up for 3.14

* Add zip error handling

* Small cleanups
This commit is contained in:
Duck
2026-01-27 14:48:50 -07:00
committed by GitHub
parent 520253e762
commit 65ef35f1b4

View File

@@ -1,7 +1,6 @@
import importlib import importlib
import importlib.abc import importlib.abc
import importlib.machinery import importlib.machinery
import importlib.util
import logging import logging
import os import os
import sys import sys
@@ -12,9 +11,10 @@ import json
from pathlib import Path from pathlib import Path
from types import ModuleType from types import ModuleType
from typing import List, Sequence from typing import List, Sequence
from zipfile import BadZipFile
from NetUtils import DataPackage from NetUtils import DataPackage
from Utils import local_path, user_path, Version, version_tuple, tuplize_version from Utils import local_path, user_path, Version, version_tuple, tuplize_version, messagebox
local_folder = os.path.dirname(__file__) local_folder = os.path.dirname(__file__)
user_folder = user_path("worlds") if user_path() != local_path() else user_path("custom_worlds") user_folder = user_path("worlds") if user_path() != local_path() else user_path("custom_worlds")
@@ -23,14 +23,14 @@ try:
except OSError: # can't access/write? except OSError: # can't access/write?
user_folder = None user_folder = None
__all__ = { __all__ = [
"network_data_package", "network_data_package",
"AutoWorldRegister", "AutoWorldRegister",
"world_sources", "world_sources",
"local_folder", "local_folder",
"user_folder", "user_folder",
"failed_world_loads", "failed_world_loads",
} ]
failed_world_loads: List[str] = [] failed_world_loads: List[str] = []
@@ -145,6 +145,15 @@ if apworlds:
logging.error(e) logging.error(e)
else: else:
raise e raise e
except BadZipFile as e:
err_message = (f"The world source {apworld_source.resolved_path} is not a valid zip. "
"It is likely either corrupted, or was packaged incorrectly.")
if sys.stdout:
raise RuntimeError(err_message) from e
else:
messagebox("Couldn't load worlds", err_message, error=True)
sys.exit(1)
if apworld.minimum_ap_version and apworld.minimum_ap_version > version_tuple: if apworld.minimum_ap_version and apworld.minimum_ap_version > version_tuple:
fail_world(apworld.game, fail_world(apworld.game,