diff --git a/.efrocachemap b/.efrocachemap index babab053..7e873b85 100644 --- a/.efrocachemap +++ b/.efrocachemap @@ -3995,50 +3995,50 @@ "assets/src/ba_data/python/ba/_generated/__init__.py": "https://files.ballistica.net/cache/ba1/ee/e8/cad05aa531c7faf7ff7b96db7f6e", "assets/src/ba_data/python/ba/_generated/enums.py": "https://files.ballistica.net/cache/ba1/b2/e5/0ee0561e16257a32830645239f34", "ballisticacore-windows/Generic/BallisticaCore.ico": "https://files.ballistica.net/cache/ba1/89/c0/e32c7d2a35dc9aef57cc73b0911a", - "build/prefab/full/linux_arm64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/fd/a3/ddce498a4373250e9655ee2bb1da", - "build/prefab/full/linux_arm64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/8b/91/c9d5fd1c7194a0be3ba38c9ddff6", - "build/prefab/full/linux_arm64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/88/2d/0ed824842a323520e69dc426acd7", - "build/prefab/full/linux_arm64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/1f/05/5b2bb76fa7bb108273a18a941060", - "build/prefab/full/linux_x86_64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/b2/7e/d19ab278cc4dbd9a33b800eaeb59", - "build/prefab/full/linux_x86_64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/71/25/0f2f737d61b8abb1d6acfd5af3ea", - "build/prefab/full/linux_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/0c/d2/219029f15cc6d160b022e9325190", - "build/prefab/full/linux_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/a4/a4/4c3192576df920570c3d44c5f109", - "build/prefab/full/mac_arm64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/ad/7d/22c09f6bfc9bc0de2d333e6eabcd", - "build/prefab/full/mac_arm64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/d7/91/73aa499ceaf42da7fcbe90a2439c", - "build/prefab/full/mac_arm64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/ad/5d/cccf8d0646f63ba1d53184177d75", - "build/prefab/full/mac_arm64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/fe/60/8717c415173b9278c27435998fd0", - "build/prefab/full/mac_x86_64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/7b/d2/0a028adf20a4446c777d964bf656", - "build/prefab/full/mac_x86_64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/1f/90/485ba24aa6addb7ef195911383a7", - "build/prefab/full/mac_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/5f/67/ee9e7340a4ac7c5a168c940a5ec4", - "build/prefab/full/mac_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/55/76/8a035a6f2f2e71213ad36c40970a", - "build/prefab/full/windows_x86_gui/debug/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/37/d4/33568dca9737e388d47e4ec3f9d0", - "build/prefab/full/windows_x86_gui/release/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/fd/0d/5ff69d357fc22193f4d1ec87e2f4", - "build/prefab/full/windows_x86_server/debug/dist/BallisticaCoreHeadless.exe": "https://files.ballistica.net/cache/ba1/dc/85/b8ba248c03c5d4e9e8885171afa0", - "build/prefab/full/windows_x86_server/release/dist/BallisticaCoreHeadless.exe": "https://files.ballistica.net/cache/ba1/a7/e2/ee819ad3e97adc5815f1d01876e3", - "build/prefab/lib/linux_arm64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/ec/70/bb76d82665f9cfc95bea6a3b277f", - "build/prefab/lib/linux_arm64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/49/36/0c77fc298d97a386f0f1c1faa020", - "build/prefab/lib/linux_arm64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/fe/35/f506a7fd6b80e89cfa4ce5a9af84", - "build/prefab/lib/linux_arm64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/a1/b1/bffa28e8677d6025f43ebaec241b", - "build/prefab/lib/linux_x86_64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/9d/f7/ee8b85edf48e549dba57e23082d9", - "build/prefab/lib/linux_x86_64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/cd/fe/e8e4ae7de89c8ac6b1093c148a5f", - "build/prefab/lib/linux_x86_64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/47/08/4662c54c56443c6ed70fd95294cd", - "build/prefab/lib/linux_x86_64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/f5/cc/e3c1d51df1cdcce702c12c2538ef", - "build/prefab/lib/mac_arm64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/6e/ff/85ffb41a77eabae5bf74e1d52607", - "build/prefab/lib/mac_arm64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/bb/dd/96ab4c30c037eff4d1005b6515ec", - "build/prefab/lib/mac_arm64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/34/8a/23328b06e397dfdafb201f429e0e", - "build/prefab/lib/mac_arm64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/09/d9/ee415075a16dccc24f365dc2c847", - "build/prefab/lib/mac_x86_64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/0f/80/d43c47af5dc56078f0e4b31049ec", - "build/prefab/lib/mac_x86_64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/ff/81/4c771163b42212f839a1fbc3b1ce", - "build/prefab/lib/mac_x86_64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/a8/f3/187de01651879d28e70ab4d2375a", - "build/prefab/lib/mac_x86_64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/de/4c/74a267e161853efc82afa8aa6b41", - "build/prefab/lib/windows/Debug_Win32/BallisticaCoreGenericInternal.lib": "https://files.ballistica.net/cache/ba1/f4/4a/7e3057f5e804bdd3d1d46af68b65", - "build/prefab/lib/windows/Debug_Win32/BallisticaCoreGenericInternal.pdb": "https://files.ballistica.net/cache/ba1/42/81/4ef15ec30288432c961f377fe914", - "build/prefab/lib/windows/Debug_Win32/BallisticaCoreHeadlessInternal.lib": "https://files.ballistica.net/cache/ba1/cc/f7/f9c425c1b21706a1fa98dbfb2efc", - "build/prefab/lib/windows/Debug_Win32/BallisticaCoreHeadlessInternal.pdb": "https://files.ballistica.net/cache/ba1/74/35/b5d4edd416127e6d53833e0aca28", - "build/prefab/lib/windows/Release_Win32/BallisticaCoreGenericInternal.lib": "https://files.ballistica.net/cache/ba1/7a/d3/41a29e5ffeca78aa7bb2f7fca5e2", - "build/prefab/lib/windows/Release_Win32/BallisticaCoreGenericInternal.pdb": "https://files.ballistica.net/cache/ba1/73/62/c40d827186e276b202b4d5610a3e", - "build/prefab/lib/windows/Release_Win32/BallisticaCoreHeadlessInternal.lib": "https://files.ballistica.net/cache/ba1/5a/86/b6f9d1d2302c5a0aa97ccc1740d5", - "build/prefab/lib/windows/Release_Win32/BallisticaCoreHeadlessInternal.pdb": "https://files.ballistica.net/cache/ba1/75/d4/89b9a3618c6a95fed6698c5a60ab", + "build/prefab/full/linux_arm64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/28/fb/c8ec7461060e8c202bc78c8fa38a", + "build/prefab/full/linux_arm64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/df/2e/97f98f053d8ea2fb55047026368a", + "build/prefab/full/linux_arm64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/df/d7/598285f85b7ec5ccd23a2ec43077", + "build/prefab/full/linux_arm64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/d5/4c/acfdc5cf15a4ba8117aa227b0e52", + "build/prefab/full/linux_x86_64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/01/8f/3630d966672380d20a61920bc103", + "build/prefab/full/linux_x86_64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/77/d5/63f0652d80179e492327112f5375", + "build/prefab/full/linux_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/af/fd/fe8b1649f9cf1052348e09c663a1", + "build/prefab/full/linux_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/1e/b8/9f600d32586d9a7783e6698dc8ea", + "build/prefab/full/mac_arm64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/80/0e/e4a6a029dadb26e1db1a0be98da3", + "build/prefab/full/mac_arm64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/cb/49/46440223ff8961704c8e89a128a3", + "build/prefab/full/mac_arm64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/4e/1c/9f25a48bb7162371f29eb52c14c6", + "build/prefab/full/mac_arm64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/8e/ed/e505dbd36f5c1c0c65ac4c60fd9d", + "build/prefab/full/mac_x86_64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/e7/b0/c4e3a6163b0a2870faf4671fcce9", + "build/prefab/full/mac_x86_64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/a2/6d/f97b9b3e983c78843c2b190a8686", + "build/prefab/full/mac_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/d1/f6/af9b07385621483956c6a7aaa3ea", + "build/prefab/full/mac_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/7d/92/5048005b193f5f0281267d5a9dad", + "build/prefab/full/windows_x86_gui/debug/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/bd/ed/b9f42b5c7ec0701e3d0773897dde", + "build/prefab/full/windows_x86_gui/release/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/96/ed/9bb84e5736f901cd46bab97100cf", + "build/prefab/full/windows_x86_server/debug/dist/BallisticaCoreHeadless.exe": "https://files.ballistica.net/cache/ba1/f0/f4/6be4d77e230d60835b2253a8bc49", + "build/prefab/full/windows_x86_server/release/dist/BallisticaCoreHeadless.exe": "https://files.ballistica.net/cache/ba1/8d/8c/a5a6e9b683d3852e5cf587e971fa", + "build/prefab/lib/linux_arm64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/14/ee/113076d5d2e088cc90230cf6ab51", + "build/prefab/lib/linux_arm64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/7e/e4/38a2a67908a08aa068c4927d3122", + "build/prefab/lib/linux_arm64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/75/fd/6250319a816a7b312051bfc2a63f", + "build/prefab/lib/linux_arm64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/e4/32/1b30542405d53f85a1eed025be9d", + "build/prefab/lib/linux_x86_64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/37/80/ce8008d84820ef0d0ca8960965c4", + "build/prefab/lib/linux_x86_64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/2e/09/a78c65202f7d1fc0fbb4d83933c3", + "build/prefab/lib/linux_x86_64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/0d/04/dba2a6ac9f1817603fccf3a5542b", + "build/prefab/lib/linux_x86_64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/20/c6/4a99477e51ef8b70db429af3719e", + "build/prefab/lib/mac_arm64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/34/24/18ef1ad96d0f203409b60424d9d0", + "build/prefab/lib/mac_arm64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/6e/83/0c5492eff9fa8ce9bafb8e39a561", + "build/prefab/lib/mac_arm64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/ab/1e/ccd89ecb93c13c4ca7c6c6a3797e", + "build/prefab/lib/mac_arm64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/16/e7/461b11e11e2026b559bfaf7c3941", + "build/prefab/lib/mac_x86_64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/e1/93/519f4f309f0f4fa8752114b70a64", + "build/prefab/lib/mac_x86_64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/dd/d1/187a739cbbe0316fd809708fa9ee", + "build/prefab/lib/mac_x86_64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/19/38/7a480d58b0ade7b5705f2f9474ee", + "build/prefab/lib/mac_x86_64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/e2/4b/524bed0bfca1b06a324163728fe1", + "build/prefab/lib/windows/Debug_Win32/BallisticaCoreGenericInternal.lib": "https://files.ballistica.net/cache/ba1/17/30/080b63fe14e6f775d439c3256f54", + "build/prefab/lib/windows/Debug_Win32/BallisticaCoreGenericInternal.pdb": "https://files.ballistica.net/cache/ba1/02/a0/5498bc8c8c55ab7e7ebdd23402b5", + "build/prefab/lib/windows/Debug_Win32/BallisticaCoreHeadlessInternal.lib": "https://files.ballistica.net/cache/ba1/7b/56/65a60485ae436ef86f8ccc8db7cf", + "build/prefab/lib/windows/Debug_Win32/BallisticaCoreHeadlessInternal.pdb": "https://files.ballistica.net/cache/ba1/83/93/bbaa2c5c664779c69cbfae1b8163", + "build/prefab/lib/windows/Release_Win32/BallisticaCoreGenericInternal.lib": "https://files.ballistica.net/cache/ba1/f1/1b/9eb27d7361d65dc0afbb26e74870", + "build/prefab/lib/windows/Release_Win32/BallisticaCoreGenericInternal.pdb": "https://files.ballistica.net/cache/ba1/d2/6f/743f2f6e1ac49577900724cefe08", + "build/prefab/lib/windows/Release_Win32/BallisticaCoreHeadlessInternal.lib": "https://files.ballistica.net/cache/ba1/be/d2/64fbeeb285197fd410a92a35624e", + "build/prefab/lib/windows/Release_Win32/BallisticaCoreHeadlessInternal.pdb": "https://files.ballistica.net/cache/ba1/5c/be/30aecc599f3c5977b40bd1155191", "src/ballistica/generated/python_embedded/binding.inc": "https://files.ballistica.net/cache/ba1/7d/3e/229a581cb2454ed856f1d8b564a7", "src/ballistica/generated/python_embedded/bootstrap.inc": "https://files.ballistica.net/cache/ba1/98/12/571b2160d69d42580e8f31fa6a8d" } \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index c6504519..8d086d5c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -### 1.7.7 (build 20762, api 7, 2022-09-04) +### 1.7.7 (build 20764, api 7, 2022-09-05) - Added `ba.app.meta.load_exported_classes()` for loading classes discovered by the meta subsystem cleanly in a background thread. - Improved logging of missing playlist game types. - Some ba.Lstr functionality can now be used in background threads. diff --git a/assets/.asset_manifest_public.json b/assets/.asset_manifest_public.json index 48810438..daf534f9 100644 --- a/assets/.asset_manifest_public.json +++ b/assets/.asset_manifest_public.json @@ -35,6 +35,7 @@ "ba_data/python/ba/__pycache__/_general.cpython-310.opt-1.pyc", "ba_data/python/ba/__pycache__/_hooks.cpython-310.opt-1.pyc", "ba_data/python/ba/__pycache__/_input.cpython-310.opt-1.pyc", + "ba_data/python/ba/__pycache__/_internal.cpython-310.opt-1.pyc", "ba_data/python/ba/__pycache__/_keyboard.cpython-310.opt-1.pyc", "ba_data/python/ba/__pycache__/_language.cpython-310.opt-1.pyc", "ba_data/python/ba/__pycache__/_level.cpython-310.opt-1.pyc", @@ -105,6 +106,7 @@ "ba_data/python/ba/_generated/enums.py", "ba_data/python/ba/_hooks.py", "ba_data/python/ba/_input.py", + "ba_data/python/ba/_internal.py", "ba_data/python/ba/_keyboard.py", "ba_data/python/ba/_language.py", "ba_data/python/ba/_level.py", diff --git a/assets/Makefile b/assets/Makefile index 685f0810..d9c89f72 100644 --- a/assets/Makefile +++ b/assets/Makefile @@ -169,6 +169,7 @@ SCRIPT_TARGETS_PY_PUBLIC = \ build/ba_data/python/ba/_generated/enums.py \ build/ba_data/python/ba/_hooks.py \ build/ba_data/python/ba/_input.py \ + build/ba_data/python/ba/_internal.py \ build/ba_data/python/ba/_keyboard.py \ build/ba_data/python/ba/_language.py \ build/ba_data/python/ba/_level.py \ @@ -420,6 +421,7 @@ SCRIPT_TARGETS_PYC_PUBLIC = \ build/ba_data/python/ba/_generated/__pycache__/enums.cpython-310.opt-1.pyc \ build/ba_data/python/ba/__pycache__/_hooks.cpython-310.opt-1.pyc \ build/ba_data/python/ba/__pycache__/_input.cpython-310.opt-1.pyc \ + build/ba_data/python/ba/__pycache__/_internal.cpython-310.opt-1.pyc \ build/ba_data/python/ba/__pycache__/_keyboard.cpython-310.opt-1.pyc \ build/ba_data/python/ba/__pycache__/_language.cpython-310.opt-1.pyc \ build/ba_data/python/ba/__pycache__/_level.cpython-310.opt-1.pyc \ diff --git a/assets/src/ba_data/python/._bainternal_sources_hash b/assets/src/ba_data/python/._bainternal_sources_hash index b56206f3..21679383 100644 --- a/assets/src/ba_data/python/._bainternal_sources_hash +++ b/assets/src/ba_data/python/._bainternal_sources_hash @@ -1 +1 @@ -126683827977798484003262787310231621875 \ No newline at end of file +161826047581351482927423840323346436406 \ No newline at end of file diff --git a/assets/src/ba_data/python/_bainternal.py b/assets/src/ba_data/python/_bainternal.py index 71ec0389..cf89a390 100644 --- a/assets/src/ba_data/python/_bainternal.py +++ b/assets/src/ba_data/python/_bainternal.py @@ -59,9 +59,7 @@ def game_service_has_leaderboard(game: str, config: str) -> bool: return bool() -def get_master_server_address(source: int = -1, - version: int = 1, - internal: bool = False) -> str: +def get_master_server_address(source: int = -1, version: int = 1) -> str: """(internal) Return the address of the master server. diff --git a/assets/src/ba_data/python/ba/_accountv1.py b/assets/src/ba_data/python/ba/_accountv1.py index 825a19a8..4d24ad2c 100644 --- a/assets/src/ba_data/python/ba/_accountv1.py +++ b/assets/src/ba_data/python/ba/_accountv1.py @@ -9,6 +9,7 @@ import time from typing import TYPE_CHECKING import _ba +import _bainternal if TYPE_CHECKING: from typing import Any @@ -41,7 +42,7 @@ class AccountV1Subsystem: def do_auto_sign_in() -> None: if _ba.app.headless_mode or _ba.app.config.get( 'Auto Account State') == 'Local': - _ba.sign_in_v1('Local') + _bainternal.sign_in_v1('Local') _ba.pushcall(do_auto_sign_in) @@ -108,8 +109,8 @@ class AccountV1Subsystem: if data['p']: pro_mult = 1.0 + float( - _ba.get_v1_account_misc_read_val('proPowerRankingBoost', - 0.0)) * 0.01 + _bainternal.get_v1_account_misc_read_val( + 'proPowerRankingBoost', 0.0)) * 0.01 else: pro_mult = 1.0 @@ -135,12 +136,13 @@ class AccountV1Subsystem: """(internal)""" # pylint: disable=cyclic-import from ba import _store - if _ba.get_v1_account_state() != 'signed_in': + if _bainternal.get_v1_account_state() != 'signed_in': return [] icons = [] store_items = _store.get_store_items() for item_name, item in list(store_items.items()): - if item_name.startswith('icons.') and _ba.get_purchased(item_name): + if item_name.startswith('icons.') and _bainternal.get_purchased( + item_name): icons.append(item['icon']) return icons @@ -152,12 +154,13 @@ class AccountV1Subsystem: (internal) """ # This only applies when we're signed in. - if _ba.get_v1_account_state() != 'signed_in': + if _bainternal.get_v1_account_state() != 'signed_in': return # If the short version of our account name currently cant be # displayed by the game, cancel. - if not _ba.have_chars(_ba.get_v1_account_display_string(full=False)): + if not _ba.have_chars( + _bainternal.get_v1_account_display_string(full=False)): return config = _ba.app.config @@ -165,7 +168,7 @@ class AccountV1Subsystem: or '__account__' not in config['Player Profiles']): # Create a spaz with a nice default purply color. - _ba.add_transaction({ + _bainternal.add_transaction({ 'type': 'ADD_PLAYER_PROFILE', 'name': '__account__', 'profile': { @@ -174,7 +177,7 @@ class AccountV1Subsystem: 'highlight': [0.5, 0.25, 1.0] } }) - _ba.run_transactions() + _bainternal.run_transactions() def have_pro(self) -> bool: """Return whether pro is currently unlocked.""" @@ -182,9 +185,9 @@ class AccountV1Subsystem: # Check our tickets-based pro upgrade and our two real-IAP based # upgrades. Also always unlock this stuff in ballistica-core builds. return bool( - _ba.get_purchased('upgrades.pro') - or _ba.get_purchased('static.pro') - or _ba.get_purchased('static.pro_sale') + _bainternal.get_purchased('upgrades.pro') + or _bainternal.get_purchased('static.pro') + or _bainternal.get_purchased('static.pro_sale') or 'ballistica' + 'core' == _ba.appname()) def have_pro_options(self) -> bool: @@ -199,7 +202,8 @@ class AccountV1Subsystem: # or also if we've been grandfathered in or are using ballistica-core # builds. return self.have_pro() or bool( - _ba.get_v1_account_misc_read_val_2('proOptionsUnlocked', False) + _bainternal.get_v1_account_misc_read_val_2('proOptionsUnlocked', + False) or _ba.app.config.get('lc14292', 0) > 1) def show_post_purchase_message(self) -> None: @@ -221,17 +225,17 @@ class AccountV1Subsystem: from ba._language import Lstr # Run any pending promo codes we had queued up while not signed in. - if _ba.get_v1_account_state( + if _bainternal.get_v1_account_state( ) == 'signed_in' and self.pending_promo_codes: for code in self.pending_promo_codes: _ba.screenmessage(Lstr(resource='submittingPromoCodeText'), color=(0, 1, 0)) - _ba.add_transaction({ + _bainternal.add_transaction({ 'type': 'PROMO_CODE', 'expire_time': time.time() + 5, 'code': code }) - _ba.run_transactions() + _bainternal.run_transactions() self.pending_promo_codes = [] def add_pending_promo_code(self, code: str) -> None: @@ -242,7 +246,7 @@ class AccountV1Subsystem: # If we're not signed in, queue up the code to run the next time we # are and issue a warning if we haven't signed in within the next # few seconds. - if _ba.get_v1_account_state() != 'signed_in': + if _bainternal.get_v1_account_state() != 'signed_in': def check_pending_codes() -> None: """(internal)""" @@ -259,9 +263,9 @@ class AccountV1Subsystem: return _ba.screenmessage(Lstr(resource='submittingPromoCodeText'), color=(0, 1, 0)) - _ba.add_transaction({ + _bainternal.add_transaction({ 'type': 'PROMO_CODE', 'expire_time': time.time() + 5, 'code': code }) - _ba.run_transactions() + _bainternal.run_transactions() diff --git a/assets/src/ba_data/python/ba/_achievement.py b/assets/src/ba_data/python/ba/_achievement.py index 22b1bc5c..006e0c7e 100644 --- a/assets/src/ba_data/python/ba/_achievement.py +++ b/assets/src/ba_data/python/ba/_achievement.py @@ -6,6 +6,7 @@ from __future__ import annotations from typing import TYPE_CHECKING import _ba +from ba import _internal from ba._error import print_exception if TYPE_CHECKING: @@ -317,10 +318,13 @@ class AchievementSubsystem: if not ach.complete: # Report new achievements to the game-service. - _ba.report_achievement(achname) + _internal.report_achievement(achname) # And to our account. - _ba.add_transaction({'type': 'ACHIEVEMENT', 'name': achname}) + _internal.add_transaction({ + 'type': 'ACHIEVEMENT', + 'name': achname + }) # Now attempt to show a banner. self.display_achievement_banner(achname) @@ -409,7 +413,7 @@ def _get_ach_mult(include_pro_bonus: bool = False) -> int: (just for display; changing this here won't affect actual rewards) """ - val: int = _ba.get_v1_account_misc_read_val('achAwardMult', 5) + val: int = _internal.get_v1_account_misc_read_val('achAwardMult', 5) assert isinstance(val, int) if include_pro_bonus and _ba.app.accounts_v1.have_pro(): val *= 2 @@ -496,7 +500,7 @@ class Achievement: # signed in, lets not show them (otherwise we tend to get # confusing 'controller connected' achievements popping up while # waiting to log in which can be confusing). - if _ba.get_v1_account_state() != 'signed_in': + if _internal.get_v1_account_state() != 'signed_in': return # If we're being freshly complete, display/report it and whatnot. @@ -592,8 +596,8 @@ class Achievement: def get_award_ticket_value(self, include_pro_bonus: bool = False) -> int: """Get the ticket award value for this achievement.""" - val: int = (_ba.get_v1_account_misc_read_val('achAward.' + self._name, - self._award) * + val: int = (_internal.get_v1_account_misc_read_val( + 'achAward.' + self._name, self._award) * _get_ach_mult(include_pro_bonus)) assert isinstance(val, int) return val @@ -601,7 +605,7 @@ class Achievement: @property def power_ranking_value(self) -> int: """Get the power-ranking award value for this achievement.""" - val: int = _ba.get_v1_account_misc_read_val( + val: int = _internal.get_v1_account_misc_read_val( 'achLeaguePoints.' + self._name, self._award) assert isinstance(val, int) return val diff --git a/assets/src/ba_data/python/ba/_ads.py b/assets/src/ba_data/python/ba/_ads.py index ff688fd4..6cf7730f 100644 --- a/assets/src/ba_data/python/ba/_ads.py +++ b/assets/src/ba_data/python/ba/_ads.py @@ -7,6 +7,7 @@ import time from typing import TYPE_CHECKING import _ba +from ba import _internal if TYPE_CHECKING: from typing import Callable, Any @@ -94,15 +95,15 @@ class AdsSubsystem: launch_count = app.config.get('launchCount', 0) # If we're seeing short ads we may want to space them differently. - interval_mult = (_ba.get_v1_account_misc_read_val( + interval_mult = (_internal.get_v1_account_misc_read_val( 'ads.shortIntervalMult', 1.0) if self.last_ad_was_short else 1.0) if self.ad_amt is None: if launch_count <= 1: - self.ad_amt = _ba.get_v1_account_misc_read_val( + self.ad_amt = _internal.get_v1_account_misc_read_val( 'ads.startVal1', 0.99) else: - self.ad_amt = _ba.get_v1_account_misc_read_val( + self.ad_amt = _internal.get_v1_account_misc_read_val( 'ads.startVal2', 1.0) interval = None else: @@ -111,15 +112,17 @@ class AdsSubsystem: # (we reach our threshold faster the longer we've been # playing). base = 'ads' if _ba.has_video_ads() else 'ads2' - min_lc = _ba.get_v1_account_misc_read_val(base + '.minLC', 0.0) - max_lc = _ba.get_v1_account_misc_read_val(base + '.maxLC', 5.0) - min_lc_scale = (_ba.get_v1_account_misc_read_val( + min_lc = _internal.get_v1_account_misc_read_val( + base + '.minLC', 0.0) + max_lc = _internal.get_v1_account_misc_read_val( + base + '.maxLC', 5.0) + min_lc_scale = (_internal.get_v1_account_misc_read_val( base + '.minLCScale', 0.25)) - max_lc_scale = (_ba.get_v1_account_misc_read_val( + max_lc_scale = (_internal.get_v1_account_misc_read_val( base + '.maxLCScale', 0.34)) - min_lc_interval = (_ba.get_v1_account_misc_read_val( + min_lc_interval = (_internal.get_v1_account_misc_read_val( base + '.minLCInterval', 360)) - max_lc_interval = (_ba.get_v1_account_misc_read_val( + max_lc_interval = (_internal.get_v1_account_misc_read_val( base + '.maxLCInterval', 300)) if launch_count < min_lc: lc_amt = 0.0 diff --git a/assets/src/ba_data/python/ba/_app.py b/assets/src/ba_data/python/ba/_app.py index 18e074d2..b1c012c9 100644 --- a/assets/src/ba_data/python/ba/_app.py +++ b/assets/src/ba_data/python/ba/_app.py @@ -20,6 +20,7 @@ from ba._meta import MetadataSubsystem from ba._ads import AdsSubsystem from ba._net import NetworkSubsystem from ba._workspace import WorkspaceSubsystem +from ba import _internal if TYPE_CHECKING: import asyncio @@ -378,7 +379,7 @@ class App: # Non-test, non-debug builds should generally be blessed; warn if not. # (so I don't accidentally release a build that can't play tourneys) if (not self.debug_build and not self.test_build - and not _ba.is_blessed()): + and not _internal.is_blessed()): _ba.screenmessage('WARNING: NON-BLESSED BUILD', color=(1, 0, 0)) # If there's a leftover log file, attempt to upload it to the @@ -416,7 +417,8 @@ class App: def check_special_offer() -> None: from bastd.ui.specialoffer import show_offer config = self.config - if ('pendingSpecialOffer' in config and _ba.get_public_login_id() + if ('pendingSpecialOffer' in config + and _internal.get_public_login_id() == config['pendingSpecialOffer']['a']): self.special_offer = config['pendingSpecialOffer']['o'] show_offer() @@ -583,11 +585,11 @@ class App: # Kick off a little transaction so we'll hopefully have all the # latest account state when we get back to the menu. - _ba.add_transaction({ + _internal.add_transaction({ 'type': 'END_SESSION', 'sType': str(type(host_session)) }) - _ba.run_transactions() + _internal.run_transactions() host_session.end() diff --git a/assets/src/ba_data/python/ba/_appconfig.py b/assets/src/ba_data/python/ba/_appconfig.py index 26d46b7d..13270319 100644 --- a/assets/src/ba_data/python/ba/_appconfig.py +++ b/assets/src/ba_data/python/ba/_appconfig.py @@ -159,8 +159,9 @@ def commit_app_config(force: bool = False) -> None: (internal) """ + from ba._internal import mark_config_dirty if not _ba.app.config_file_healthy and not force: print('Current config file is broken; ' 'skipping write to avoid losing settings.') return - _ba.mark_config_dirty() + mark_config_dirty() diff --git a/assets/src/ba_data/python/ba/_apputils.py b/assets/src/ba_data/python/ba/_apputils.py index 7196e646..e1d5d626 100644 --- a/assets/src/ba_data/python/ba/_apputils.py +++ b/assets/src/ba_data/python/ba/_apputils.py @@ -58,6 +58,7 @@ def handle_log() -> None: """ from ba._net import master_server_post from ba._generated.enums import TimeType + from ba._internal import get_news_show app = _ba.app app.log_have_new = True if not app.log_upload_timer_started: @@ -83,7 +84,7 @@ def handle_log() -> None: 'userRanCommands': _ba.has_user_run_commands(), 'time': _ba.time(TimeType.REAL), 'userModded': _ba.workspaces_in_use(), - 'newsShow': _ba.get_news_show(), + 'newsShow': get_news_show(), } def response(data: Any) -> None: diff --git a/assets/src/ba_data/python/ba/_bootstrap.py b/assets/src/ba_data/python/ba/_bootstrap.py index 6e3dba42..9502a217 100644 --- a/assets/src/ba_data/python/ba/_bootstrap.py +++ b/assets/src/ba_data/python/ba/_bootstrap.py @@ -32,7 +32,7 @@ def bootstrap() -> None: # Give a soft warning if we're being used with a different binary # version than we expect. - expected_build = 20762 + expected_build = 20764 running_build: int = env['build_number'] if running_build != expected_build: print( diff --git a/assets/src/ba_data/python/ba/_coopgame.py b/assets/src/ba_data/python/ba/_coopgame.py index f48fbc59..ecae427b 100644 --- a/assets/src/ba_data/python/ba/_coopgame.py +++ b/assets/src/ba_data/python/ba/_coopgame.py @@ -6,6 +6,7 @@ from __future__ import annotations from typing import TYPE_CHECKING, TypeVar import _ba +from ba import _internal from ba._gameactivity import GameActivity from ba._general import WeakCall @@ -217,10 +218,10 @@ class CoopGameActivity(GameActivity[PlayerType, TeamType]): self._achievements_awarded.add(achievement_name) # Report new achievements to the game-service. - _ba.report_achievement(achievement_name) + _internal.report_achievement(achievement_name) # ...and to our account. - _ba.add_transaction({ + _internal.add_transaction({ 'type': 'ACHIEVEMENT', 'name': achievement_name }) diff --git a/assets/src/ba_data/python/ba/_gameactivity.py b/assets/src/ba_data/python/ba/_gameactivity.py index 1b91f16f..46dcdf09 100644 --- a/assets/src/ba_data/python/ba/_gameactivity.py +++ b/assets/src/ba_data/python/ba/_gameactivity.py @@ -9,6 +9,7 @@ import random from typing import TYPE_CHECKING, TypeVar import _ba +from ba import _internal from ba._activity import Activity from ba._score import ScoreConfig from ba._language import Lstr @@ -240,11 +241,11 @@ class GameActivity(Activity[PlayerType, TeamType]): self._zoom_message_times: dict[int, float] = {} self._is_waiting_for_continue = False - self._continue_cost = _ba.get_v1_account_misc_read_val( + self._continue_cost = _internal.get_v1_account_misc_read_val( 'continueStartCost', 25) - self._continue_cost_mult = _ba.get_v1_account_misc_read_val( + self._continue_cost_mult = _internal.get_v1_account_misc_read_val( 'continuesMult', 2) - self._continue_cost_offset = _ba.get_v1_account_misc_read_val( + self._continue_cost_offset = _internal.get_v1_account_misc_read_val( 'continuesOffset', 0) @property @@ -364,11 +365,11 @@ class GameActivity(Activity[PlayerType, TeamType]): if do_continue: _ba.playsound(_ba.getsound('shieldUp')) _ba.playsound(_ba.getsound('cashRegister')) - _ba.add_transaction({ + _internal.add_transaction({ 'type': 'CONTINUE', 'cost': self._continue_cost }) - _ba.run_transactions() + _internal.run_transactions() self._continue_cost = ( self._continue_cost * self._continue_cost_mult + self._continue_cost_offset) @@ -391,7 +392,8 @@ class GameActivity(Activity[PlayerType, TeamType]): from ba._generated.enums import TimeType try: - if _ba.get_v1_account_misc_read_val('enableContinues', False): + if _internal.get_v1_account_misc_read_val('enableContinues', + False): session = self.session # We only support continuing in non-tournament games. @@ -454,7 +456,7 @@ class GameActivity(Activity[PlayerType, TeamType]): # time is left. tournament_id = self.session.tournament_id if tournament_id is not None: - _ba.tournament_query( + _internal.tournament_query( args={ 'tournamentIDs': [tournament_id], 'source': 'in-game time remaining query' diff --git a/assets/src/ba_data/python/ba/_hooks.py b/assets/src/ba_data/python/ba/_hooks.py index 5af9fe3f..9d103449 100644 --- a/assets/src/ba_data/python/ba/_hooks.py +++ b/assets/src/ba_data/python/ba/_hooks.py @@ -16,6 +16,7 @@ from __future__ import annotations from typing import TYPE_CHECKING import _ba +from ba import _internal if TYPE_CHECKING: from typing import Sequence, Any @@ -189,8 +190,8 @@ def unavailable_message() -> None: def submit_analytics_counts(sval: str) -> None: - _ba.add_transaction({'type': 'ANALYTICS_COUNTS', 'values': sval}) - _ba.run_transactions() + _internal.add_transaction({'type': 'ANALYTICS_COUNTS', 'values': sval}) + _internal.run_transactions() def set_last_ad_network(sval: str) -> None: diff --git a/assets/src/ba_data/python/ba/_input.py b/assets/src/ba_data/python/ba/_input.py index bfea7280..fc21a436 100644 --- a/assets/src/ba_data/python/ba/_input.py +++ b/assets/src/ba_data/python/ba/_input.py @@ -6,6 +6,7 @@ from __future__ import annotations from typing import TYPE_CHECKING import _ba +from ba._internal import get_v1_account_display_string if TYPE_CHECKING: from typing import Any @@ -639,5 +640,5 @@ def get_last_player_name_from_input_device(device: ba.InputDevice) -> str: if profilename == '_random': profilename = device.get_default_player_name() if profilename == '__account__': - profilename = _ba.get_v1_account_display_string() + profilename = get_v1_account_display_string() return profilename diff --git a/assets/src/ba_data/python/ba/_internal.py b/assets/src/ba_data/python/ba/_internal.py new file mode 100644 index 00000000..5637e6a5 --- /dev/null +++ b/assets/src/ba_data/python/ba/_internal.py @@ -0,0 +1,367 @@ +# Released under the MIT License. See LICENSE for details. +# +"""A soft wrapper around _bainternal. + +This allows code to use _bainternal functionality and get warnings +or fallbacks in some cases instead of hard errors. Code that absolutely +relies on the presence of _bainternal can just use that module directly. +""" + +from __future__ import annotations + +from typing import TYPE_CHECKING + +try: + # noinspection PyUnresolvedReferences + import _bainternal + HAVE_INTERNAL = True +except ImportError: + HAVE_INTERNAL = False + +if TYPE_CHECKING: + from typing import Callable, Any + + +# Code that will function without _bainternal but which should be updated +# to account for its absence should call this to draw attention to itself. +def _no_bainternal_warning() -> None: + import logging + logging.warning('INTERNAL CALL RUN WITHOUT INTERNAL PRESENT.') + + +# Code that won't work without _bainternal should raise these errors. +def _no_bainternal_error() -> RuntimeError: + raise RuntimeError('_bainternal is not present') + + +def get_v2_fleet() -> str: + """(internal)""" + if HAVE_INTERNAL: + return _bainternal.get_v2_fleet() + raise _no_bainternal_error() + + +def get_master_server_address(source: int = -1, version: int = 1) -> str: + """(internal) + + Return the address of the master server. + """ + if HAVE_INTERNAL: + return _bainternal.get_master_server_address(source=source, + version=version) + raise _no_bainternal_error() + + +def is_blessed() -> bool: + """(internal)""" + if HAVE_INTERNAL: + return _bainternal.is_blessed() + + # Harmless to always just say no here. + return False + + +def get_news_show() -> str: + """(internal)""" + if HAVE_INTERNAL: + return _bainternal.get_news_show() + raise _no_bainternal_error() + + +def game_service_has_leaderboard(game: str, config: str) -> bool: + """(internal) + + Given a game and config string, returns whether there is a leaderboard + for it on the game service. + """ + if HAVE_INTERNAL: + return _bainternal.game_service_has_leaderboard(game=game, + config=config) + # Harmless to always just say no here. + return False + + +def report_achievement(achievement: str, pass_to_account: bool = True) -> None: + """(internal)""" + if HAVE_INTERNAL: + _bainternal.report_achievement(achievement=achievement, + pass_to_account=pass_to_account) + return + + # Need to see if this actually still works as expected.. warning for now. + _no_bainternal_warning() + + +# noinspection PyUnresolvedReferences +def submit_score(game: str, + config: str, + name: Any, + score: int | None, + callback: Callable, + friend_callback: Callable | None, + order: str = 'increasing', + tournament_id: str | None = None, + score_type: str = 'points', + campaign: str | None = None, + level: str | None = None) -> None: + """(internal) + + Submit a score to the server; callback will be called with the results. + As a courtesy, please don't send fake scores to the server. I'd prefer + to devote my time to improving the game instead of trying to make the + score server more mischief-proof. + """ + if HAVE_INTERNAL: + _bainternal.submit_score(game=game, + config=config, + name=name, + score=score, + callback=callback, + friend_callback=friend_callback, + order=order, + tournament_id=tournament_id, + score_type=score_type, + campaign=campaign, + level=level) + return + # This technically breaks since callback will never be called/etc. + raise _no_bainternal_error() + + +def tournament_query(callback: Callable[[dict | None], None], + args: dict) -> None: + """(internal)""" + if HAVE_INTERNAL: + _bainternal.tournament_query(callback=callback, args=args) + return + + # This technically breaks since callback will never be called/etc. + raise _no_bainternal_error() + + +def power_ranking_query(callback: Callable, season: Any = None) -> None: + """(internal)""" + if HAVE_INTERNAL: + _bainternal.power_ranking_query(callback=callback, season=season) + return + + # This technically breaks since callback will never be called/etc. + raise _no_bainternal_error() + + +def restore_purchases() -> None: + """(internal)""" + if HAVE_INTERNAL: + _bainternal.restore_purchases() + return + + # This shouldn't break anything but should try to avoid calling it. + _no_bainternal_warning() + + +def purchase(item: str) -> None: + """(internal)""" + + if HAVE_INTERNAL: + _bainternal.purchase(item) + return + + # This won't break messily but won't function as intended. + _no_bainternal_warning() + + +def get_purchases_state() -> int: + """(internal)""" + + if HAVE_INTERNAL: + return _bainternal.get_purchases_state() + + # This won't function correctly without internal. + raise _no_bainternal_error() + + +def get_purchased(item: str) -> bool: + """(internal)""" + + if HAVE_INTERNAL: + return _bainternal.get_purchased(item) + + # Without internal we can just assume no purchases. + return False + + +def get_price(item: str) -> str | None: + """(internal)""" + + if HAVE_INTERNAL: + return _bainternal.get_price(item) + + # Without internal we can just assume no prices. + return None + + +def in_game_purchase(item: str, price: int) -> None: + """(internal)""" + + if HAVE_INTERNAL: + _bainternal.in_game_purchase(item=item, price=price) + return + + # Without internal this doesn't function as expected. + raise _no_bainternal_error() + + +# noinspection PyUnresolvedReferences +def add_transaction(transaction: dict, + callback: Callable | None = None) -> None: + """(internal)""" + if HAVE_INTERNAL: + _bainternal.add_transaction(transaction=transaction, callback=callback) + return + + # This won't function correctly without internal (callback never called). + raise _no_bainternal_error() + + +def reset_achievements() -> None: + """(internal)""" + if HAVE_INTERNAL: + _bainternal.reset_achievements() + return + + # Technically doesnt break but won't do anything. + _no_bainternal_warning() + + +def get_public_login_id() -> str | None: + """(internal)""" + + if HAVE_INTERNAL: + return _bainternal.get_public_login_id() + + # Harmless to return nothing in this case. + return None + + +def have_outstanding_transactions() -> bool: + """(internal)""" + + if HAVE_INTERNAL: + return _bainternal.have_outstanding_transactions() + + # Harmless to return False here. + return False + + +def run_transactions() -> None: + """(internal)""" + if HAVE_INTERNAL: + _bainternal.run_transactions() + + # Harmless no-op in this case. + + +def get_v1_account_misc_read_val(name: str, default_value: Any) -> Any: + """(internal)""" + if HAVE_INTERNAL: + return _bainternal.get_v1_account_misc_read_val( + name=name, default_value=default_value) + raise _no_bainternal_error() + + +def get_v1_account_misc_read_val_2(name: str, default_value: Any) -> Any: + """(internal)""" + if HAVE_INTERNAL: + return _bainternal.get_v1_account_misc_read_val_2( + name=name, default_value=default_value) + raise _no_bainternal_error() + + +def get_v1_account_misc_val(name: str, default_value: Any) -> Any: + """(internal)""" + if HAVE_INTERNAL: + return _bainternal.get_v1_account_misc_val(name=name, + default_value=default_value) + raise _no_bainternal_error() + + +def get_v1_account_ticket_count() -> int: + """(internal) + + Returns the number of tickets for the current account. + """ + + if HAVE_INTERNAL: + return _bainternal.get_v1_account_ticket_count() + return 0 + + +def get_v1_account_state_num() -> int: + """(internal)""" + if HAVE_INTERNAL: + return _bainternal.get_v1_account_state_num() + return 0 + + +def get_v1_account_state() -> str: + """(internal)""" + if HAVE_INTERNAL: + return _bainternal.get_v1_account_state() + raise _no_bainternal_error() + + +def get_v1_account_display_string(full: bool = True) -> str: + """(internal)""" + if HAVE_INTERNAL: + return _bainternal.get_v1_account_display_string(full=full) + raise _no_bainternal_error() + + +def get_v1_account_type() -> str: + """(internal)""" + if HAVE_INTERNAL: + return _bainternal.get_v1_account_type() + raise _no_bainternal_error() + + +def get_v1_account_name() -> str: + """(internal)""" + if HAVE_INTERNAL: + return _bainternal.get_v1_account_name() + raise _no_bainternal_error() + + +def sign_out_v1(v2_embedded: bool = False) -> None: + """(internal) + + Category: General Utility Functions + """ + if HAVE_INTERNAL: + _bainternal.sign_out_v1(v2_embedded=v2_embedded) + return + raise _no_bainternal_error() + + +def sign_in_v1(account_type: str) -> None: + """(internal) + + Category: General Utility Functions + """ + if HAVE_INTERNAL: + _bainternal.sign_in_v1(account_type=account_type) + return + raise _no_bainternal_error() + + +def mark_config_dirty() -> None: + """(internal) + + Category: General Utility Functions + """ + if HAVE_INTERNAL: + _bainternal.mark_config_dirty() + return + + # Note to self - need to fix config writing to not rely on + # internal lib. + _no_bainternal_warning() diff --git a/assets/src/ba_data/python/ba/_net.py b/assets/src/ba_data/python/ba/_net.py index 003b0320..7fac86fb 100644 --- a/assets/src/ba_data/python/ba/_net.py +++ b/assets/src/ba_data/python/ba/_net.py @@ -134,15 +134,16 @@ class MasterServerCallThread(threading.Thread): import json from efro.error import is_urllib_communication_error - from ba import _general + from ba._general import Call, utf8_all + from ba._internal import get_master_server_address response_data: Any = None url: str | None = None try: - self._data = _general.utf8_all(self._data) + self._data = utf8_all(self._data) _ba.set_thread_name('BA_ServerCallThread') if self._request_type == 'get': - url = (_ba.get_master_server_address() + '/' + self._request + + url = (get_master_server_address() + '/' + self._request + '?' + urllib.parse.urlencode(self._data)) response = urllib.request.urlopen( urllib.request.Request( @@ -150,7 +151,7 @@ class MasterServerCallThread(threading.Thread): context=_ba.app.net.sslcontext, timeout=DEFAULT_REQUEST_TIMEOUT_SECONDS) elif self._request_type == 'post': - url = _ba.get_master_server_address() + '/' + self._request + url = get_master_server_address() + '/' + self._request response = urllib.request.urlopen( urllib.request.Request( url, @@ -189,7 +190,7 @@ class MasterServerCallThread(threading.Thread): response_data = None if self._callback is not None: - _ba.pushcall(_general.Call(self._run_callback, response_data), + _ba.pushcall(Call(self._run_callback, response_data), from_other_thread=True) diff --git a/assets/src/ba_data/python/ba/_servermode.py b/assets/src/ba_data/python/ba/_servermode.py index 19aecb59..ebc7f20d 100644 --- a/assets/src/ba_data/python/ba/_servermode.py +++ b/assets/src/ba_data/python/ba/_servermode.py @@ -13,6 +13,8 @@ from bacommon.servermanager import (ServerCommand, StartServerModeCommand, ChatMessageCommand, ScreenMessageCommand, ClientListCommand, KickCommand) import _ba +from ba._internal import (add_transaction, run_transactions, + get_v1_account_state) from ba._generated.enums import TimeType from ba._freeforallsession import FreeForAllSession from ba._dualteamsession import DualTeamSession @@ -227,7 +229,7 @@ class ServerController: def _prepare_to_serve(self) -> None: """Run in a timer to do prep before beginning to serve.""" - signed_in = _ba.get_v1_account_state() == 'signed_in' + signed_in = get_v1_account_state() == 'signed_in' if not signed_in: # Signing in to the local server account should not take long; @@ -247,14 +249,14 @@ class ServerController: if not self._playlist_fetch_sent_request: print(f'{Clr.SBLU}Requesting shared-playlist' f' {self._config.playlist_code}...{Clr.RST}') - _ba.add_transaction( + add_transaction( { 'type': 'IMPORT_PLAYLIST', 'code': str(self._config.playlist_code), 'overwrite': True }, callback=self._on_playlist_fetch_response) - _ba.run_transactions() + run_transactions() self._playlist_fetch_sent_request = True if self._playlist_fetch_got_response: @@ -302,7 +304,7 @@ class ServerController: appcfg = app.config sessiontype = self._get_session_type() - if _ba.get_v1_account_state() != 'signed_in': + if get_v1_account_state() != 'signed_in': print('WARNING: launch_server_session() expects to run ' 'with a signed in server account') @@ -322,13 +324,13 @@ class ServerController: # Need to add this in a transaction instead of just setting # it directly or it will get overwritten by the master-server. - _ba.add_transaction({ + add_transaction({ 'type': 'ADD_PLAYLIST', 'playlistType': ptypename, 'playlistName': self._playlist_name, 'playlist': self._config.playlist_inline }) - _ba.run_transactions() + run_transactions() if self._first_run: curtimestr = time.strftime('%c') diff --git a/assets/src/ba_data/python/ba/_session.py b/assets/src/ba_data/python/ba/_session.py index 5413499e..02309f4b 100644 --- a/assets/src/ba_data/python/ba/_session.py +++ b/assets/src/ba_data/python/ba/_session.py @@ -615,6 +615,7 @@ class Session: def transitioning_out_activity_was_freed( self, can_show_ad_on_death: bool) -> None: """(internal)""" + # pylint: disable=cyclic-import from ba._apputils import garbage_collect # Since things should be generally still right now, it's a good time diff --git a/assets/src/ba_data/python/ba/_store.py b/assets/src/ba_data/python/ba/_store.py index deeefb0d..f56b0a84 100644 --- a/assets/src/ba_data/python/ba/_store.py +++ b/assets/src/ba_data/python/ba/_store.py @@ -7,6 +7,7 @@ from __future__ import annotations from typing import TYPE_CHECKING import _ba +from ba import _internal if TYPE_CHECKING: from typing import Any @@ -366,11 +367,11 @@ def get_store_layout() -> dict[str, list[dict[str, Any]]]: 'games.ninja_fight', 'games.meteor_shower', 'games.target_practice' ] }] - if _ba.get_v1_account_misc_read_val('xmas', False): + if _internal.get_v1_account_misc_read_val('xmas', False): store_layout['characters'][0]['items'].append('characters.santa') store_layout['characters'][0]['items'].append('characters.wizard') store_layout['characters'][0]['items'].append('characters.cyborg') - if _ba.get_v1_account_misc_read_val('easter', False): + if _internal.get_v1_account_misc_read_val('easter', False): store_layout['characters'].append({ 'title': 'store.holidaySpecialText', 'items': ['characters.bunny'] @@ -401,10 +402,10 @@ def get_clean_price(price_string: str) -> str: def get_available_purchase_count(tab: str | None = None) -> int: """(internal)""" try: - if _ba.get_v1_account_state() != 'signed_in': + if _internal.get_v1_account_state() != 'signed_in': return 0 count = 0 - our_tickets = _ba.get_v1_account_ticket_count() + our_tickets = _internal.get_v1_account_ticket_count() store_data = get_store_layout() if tab is not None: tabs = [(tab, store_data[tab])] @@ -425,11 +426,11 @@ def _calc_count_for_tab(tabval: list[dict[str, Any]], our_tickets: int, count: int) -> int: for section in tabval: for item in section['items']: - ticket_cost = _ba.get_v1_account_misc_read_val( + ticket_cost = _internal.get_v1_account_misc_read_val( 'price.' + item, None) if ticket_cost is not None: if (our_tickets >= ticket_cost - and not _ba.get_purchased(item)): + and not _internal.get_purchased(item)): count += 1 return count @@ -463,7 +464,7 @@ def get_available_sale_time(tab: str) -> int | None: # We start the timer once we get the duration from # the server. - start_duration = _ba.get_v1_account_misc_read_val( + start_duration = _internal.get_v1_account_misc_read_val( 'proSaleDurationMinutes', None) if start_duration is not None: app.pro_sale_start_time = int( @@ -489,12 +490,12 @@ def get_available_sale_time(tab: str) -> int | None: sale_times.append(val) # Now look for sales in this tab. - sales_raw = _ba.get_v1_account_misc_read_val('sales', {}) + sales_raw = _internal.get_v1_account_misc_read_val('sales', {}) store_layout = get_store_layout() for section in store_layout[tab]: for item in section['items']: if item in sales_raw: - if not _ba.get_purchased(item): + if not _internal.get_purchased(item): to_end = ((datetime.datetime.utcfromtimestamp( sales_raw[item]['e']) - datetime.datetime.utcnow()).total_seconds()) @@ -520,7 +521,7 @@ def get_unowned_maps() -> list[str]: if not _ba.app.headless_mode: for map_section in get_store_layout()['maps']: for mapitem in map_section['items']: - if not _ba.get_purchased(mapitem): + if not _internal.get_purchased(mapitem): m_info = get_store_item(mapitem) unowned_maps.add(m_info['map_type'].name) return sorted(unowned_maps) @@ -533,7 +534,7 @@ def get_unowned_game_types() -> set[type[ba.GameActivity]]: if not _ba.app.headless_mode: for section in get_store_layout()['minigames']: for mname in section['items']: - if not _ba.get_purchased(mname): + if not _internal.get_purchased(mname): m_info = get_store_item(mname) unowned_games.add(m_info['gametype']) return unowned_games diff --git a/assets/src/ba_data/python/ba/internal.py b/assets/src/ba_data/python/ba/internal.py index fb7ee327..7a02ecb6 100644 --- a/assets/src/ba_data/python/ba/internal.py +++ b/assets/src/ba_data/python/ba/internal.py @@ -6,6 +6,7 @@ Classes and functions contained here, while technically 'public', may change or disappear without warning, so should be avoided (or used sparingly and defensively) in mods. """ +from __future__ import annotations from ba._map import (get_map_class, register_map, preload_map_preview_media, get_map_display_string, get_filtered_map_name) @@ -38,6 +39,19 @@ from ba._store import (get_available_sale_time, get_available_purchase_count, from ba._tournament import get_tournament_prize_strings from ba._gameutils import get_trophy_string +from ba._internal import ( + get_v2_fleet, get_master_server_address, is_blessed, get_news_show, + game_service_has_leaderboard, report_achievement, submit_score, + tournament_query, power_ranking_query, restore_purchases, purchase, + get_purchases_state, get_purchased, get_price, in_game_purchase, + add_transaction, reset_achievements, get_public_login_id, + have_outstanding_transactions, run_transactions, + get_v1_account_misc_read_val, get_v1_account_misc_read_val_2, + get_v1_account_misc_val, get_v1_account_ticket_count, + get_v1_account_state_num, get_v1_account_state, + get_v1_account_display_string, get_v1_account_type, get_v1_account_name, + sign_out_v1, sign_in_v1, mark_config_dirty) + __all__ = [ 'get_unowned_maps', 'get_unowned_game_types', 'get_map_class', 'register_map', 'preload_map_preview_media', 'get_map_display_string', @@ -56,5 +70,16 @@ __all__ = [ 'get_default_teams_playlist', 'filter_playlist', 'get_available_sale_time', 'get_available_purchase_count', 'get_store_item_name_translated', 'get_store_item_display_size', 'get_store_layout', 'get_store_item', - 'get_clean_price', 'get_tournament_prize_strings', 'get_trophy_string' + 'get_clean_price', 'get_tournament_prize_strings', 'get_trophy_string', + 'get_v2_fleet', 'get_master_server_address', 'is_blessed', 'get_news_show', + 'game_service_has_leaderboard', 'report_achievement', 'submit_score', + 'tournament_query', 'power_ranking_query', 'restore_purchases', 'purchase', + 'get_purchases_state', 'get_purchased', 'get_price', 'in_game_purchase', + 'add_transaction', 'reset_achievements', 'get_public_login_id', + 'have_outstanding_transactions', 'run_transactions', + 'get_v1_account_misc_read_val', 'get_v1_account_misc_read_val_2', + 'get_v1_account_misc_val', 'get_v1_account_ticket_count', + 'get_v1_account_state_num', 'get_v1_account_state', + 'get_v1_account_display_string', 'get_v1_account_type', + 'get_v1_account_name', 'sign_out_v1', 'sign_in_v1', 'mark_config_dirty' ] diff --git a/assets/src/ba_data/python/bastd/activity/coopscore.py b/assets/src/ba_data/python/bastd/activity/coopscore.py index c2bd61e4..7baf547b 100644 --- a/assets/src/ba_data/python/bastd/activity/coopscore.py +++ b/assets/src/ba_data/python/bastd/activity/coopscore.py @@ -10,6 +10,7 @@ from typing import TYPE_CHECKING import _ba import ba +import ba.internal from bastd.actor.text import Text from bastd.actor.zoomtext import ZoomText @@ -52,9 +53,9 @@ class CoopScoreScreen(ba.Activity[ba.Player, ba.Team]): ba.app.ach.achievements_for_coop_level(self._campaign.name + ':' + settings['level'])) - self._account_type = (_ba.get_v1_account_type() - if _ba.get_v1_account_state() == 'signed_in' else - None) + self._account_type = (ba.internal.get_v1_account_type() + if ba.internal.get_v1_account_state() + == 'signed_in' else None) self._game_service_icon_color: Sequence[float] | None self._game_service_achievements_texture: ba.Texture | None @@ -167,7 +168,7 @@ class CoopScoreScreen(ba.Activity[ba.Player, ba.Team]): # If game-center/etc scores are available we show our friends' # scores. Otherwise we show our local high scores. - self._show_friend_scores = _ba.game_service_has_leaderboard( + self._show_friend_scores = ba.internal.game_service_has_leaderboard( self._game_name_str, self._game_config_str) try: @@ -552,7 +553,7 @@ class CoopScoreScreen(ba.Activity[ba.Player, ba.Team]): # Any time we complete a level, set the next one as unlocked. if self._is_complete and self._is_more_levels: - _ba.add_transaction({ + ba.internal.add_transaction({ 'type': 'COMPLETE_LEVEL', 'campaign': self._campaign.name, 'level': self._level_name @@ -632,7 +633,7 @@ class CoopScoreScreen(ba.Activity[ba.Player, ba.Team]): if ba.app.server is None: # If we're running in normal non-headless build, show this text # because only host can continue the game. - adisp = _ba.get_v1_account_display_string() + adisp = ba.internal.get_v1_account_display_string() txt = Text(ba.Lstr(resource='waitingForHostText', subs=[('${HOST}', adisp)]), maxwidth=300, @@ -726,14 +727,14 @@ class CoopScoreScreen(ba.Activity[ba.Player, ba.Team]): if self._score is not None: sver = (self._campaign.getlevel( self._level_name).get_score_version_string()) - _ba.add_transaction({ + ba.internal.add_transaction({ 'type': 'SET_LEVEL_LOCAL_HIGH_SCORES', 'campaign': self._campaign.name, 'level': self._level_name, 'scoreVersion': sver, 'scores': our_high_scores_all }) - if _ba.get_v1_account_state() != 'signed_in': + if ba.internal.get_v1_account_state() != 'signed_in': # We expect this only in kiosk mode; complain otherwise. if not (ba.app.demo_mode or ba.app.arcade_mode): print('got not-signed-in at score-submit; unexpected') @@ -743,21 +744,22 @@ class CoopScoreScreen(ba.Activity[ba.Player, ba.Team]): else: assert self._game_name_str is not None assert self._game_config_str is not None - _ba.submit_score(self._game_name_str, - self._game_config_str, - name_str, - self._score, - ba.WeakCall(self._got_score_results), - ba.WeakCall(self._got_friend_score_results) - if self._show_friend_scores else None, - order=self._score_order, - tournament_id=self.session.tournament_id, - score_type=self._score_type, - campaign=self._campaign.name, - level=self._level_name) + ba.internal.submit_score( + self._game_name_str, + self._game_config_str, + name_str, + self._score, + ba.WeakCall(self._got_score_results), + ba.WeakCall(self._got_friend_score_results) + if self._show_friend_scores else None, + order=self._score_order, + tournament_id=self.session.tournament_id, + score_type=self._score_type, + campaign=self._campaign.name, + level=self._level_name) # Apply the transactions we've been adding locally. - _ba.run_transactions() + ba.internal.run_transactions() # If we're not doing the world's-best button, just show a title # instead. @@ -1077,8 +1079,9 @@ class CoopScoreScreen(ba.Activity[ba.Player, ba.Team]): # Prepend our master-server addr if its a relative addr. if (not self._score_link.startswith('http://') and not self._score_link.startswith('https://')): - self._score_link = (_ba.get_master_server_address() + '/' + - self._score_link) + self._score_link = ( + ba.internal.get_master_server_address() + '/' + + self._score_link) self._score_loading_status = None if 'tournamentSecondsRemaining' in results: secs_remaining = results['tournamentSecondsRemaining'] diff --git a/assets/src/ba_data/python/bastd/actor/spazappearance.py b/assets/src/ba_data/python/bastd/actor/spazappearance.py index bab2a8c9..801000e1 100644 --- a/assets/src/ba_data/python/bastd/actor/spazappearance.py +++ b/assets/src/ba_data/python/bastd/actor/spazappearance.py @@ -5,8 +5,8 @@ from __future__ import annotations from typing import TYPE_CHECKING -import _ba import ba +import ba.internal if TYPE_CHECKING: pass @@ -16,66 +16,67 @@ def get_appearances(include_locked: bool = False) -> list[str]: """Get the list of available spaz appearances.""" # pylint: disable=too-many-statements # pylint: disable=too-many-branches + get_purchased = ba.internal.get_purchased disallowed = [] if not include_locked: # hmm yeah this'll be tough to hack... - if not _ba.get_purchased('characters.santa'): + if not get_purchased('characters.santa'): disallowed.append('Santa Claus') - if not _ba.get_purchased('characters.frosty'): + if not get_purchased('characters.frosty'): disallowed.append('Frosty') - if not _ba.get_purchased('characters.bones'): + if not get_purchased('characters.bones'): disallowed.append('Bones') - if not _ba.get_purchased('characters.bernard'): + if not get_purchased('characters.bernard'): disallowed.append('Bernard') - if not _ba.get_purchased('characters.pixie'): + if not get_purchased('characters.pixie'): disallowed.append('Pixel') - if not _ba.get_purchased('characters.pascal'): + if not get_purchased('characters.pascal'): disallowed.append('Pascal') - if not _ba.get_purchased('characters.actionhero'): + if not get_purchased('characters.actionhero'): disallowed.append('Todd McBurton') - if not _ba.get_purchased('characters.taobaomascot'): + if not get_purchased('characters.taobaomascot'): disallowed.append('Taobao Mascot') - if not _ba.get_purchased('characters.agent'): + if not get_purchased('characters.agent'): disallowed.append('Agent Johnson') - if not _ba.get_purchased('characters.jumpsuit'): + if not get_purchased('characters.jumpsuit'): disallowed.append('Lee') - if not _ba.get_purchased('characters.assassin'): + if not get_purchased('characters.assassin'): disallowed.append('Zola') - if not _ba.get_purchased('characters.wizard'): + if not get_purchased('characters.wizard'): disallowed.append('Grumbledorf') - if not _ba.get_purchased('characters.cowboy'): + if not get_purchased('characters.cowboy'): disallowed.append('Butch') - if not _ba.get_purchased('characters.witch'): + if not get_purchased('characters.witch'): disallowed.append('Witch') - if not _ba.get_purchased('characters.warrior'): + if not get_purchased('characters.warrior'): disallowed.append('Warrior') - if not _ba.get_purchased('characters.superhero'): + if not get_purchased('characters.superhero'): disallowed.append('Middle-Man') - if not _ba.get_purchased('characters.alien'): + if not get_purchased('characters.alien'): disallowed.append('Alien') - if not _ba.get_purchased('characters.oldlady'): + if not get_purchased('characters.oldlady'): disallowed.append('OldLady') - if not _ba.get_purchased('characters.gladiator'): + if not get_purchased('characters.gladiator'): disallowed.append('Gladiator') - if not _ba.get_purchased('characters.wrestler'): + if not get_purchased('characters.wrestler'): disallowed.append('Wrestler') - if not _ba.get_purchased('characters.operasinger'): + if not get_purchased('characters.operasinger'): disallowed.append('Gretel') - if not _ba.get_purchased('characters.robot'): + if not get_purchased('characters.robot'): disallowed.append('Robot') - if not _ba.get_purchased('characters.cyborg'): + if not get_purchased('characters.cyborg'): disallowed.append('B-9000') - if not _ba.get_purchased('characters.bunny'): + if not get_purchased('characters.bunny'): disallowed.append('Easter Bunny') - if not _ba.get_purchased('characters.kronk'): + if not get_purchased('characters.kronk'): disallowed.append('Kronk') - if not _ba.get_purchased('characters.zoe'): + if not get_purchased('characters.zoe'): disallowed.append('Zoe') - if not _ba.get_purchased('characters.jackmorgan'): + if not get_purchased('characters.jackmorgan'): disallowed.append('Jack Morgan') - if not _ba.get_purchased('characters.mel'): + if not get_purchased('characters.mel'): disallowed.append('Mel') - if not _ba.get_purchased('characters.snakeshadow'): + if not get_purchased('characters.snakeshadow'): disallowed.append('Snake Shadow') return [ s for s in list(ba.app.spaz_appearances.keys()) if s not in disallowed diff --git a/assets/src/ba_data/python/bastd/actor/spazfactory.py b/assets/src/ba_data/python/bastd/actor/spazfactory.py index 0840d8f5..27e78d13 100644 --- a/assets/src/ba_data/python/bastd/actor/spazfactory.py +++ b/assets/src/ba_data/python/bastd/actor/spazfactory.py @@ -7,8 +7,8 @@ from __future__ import annotations from typing import TYPE_CHECKING import ba +import ba.internal from bastd.gameutils import SharedObjects -import _ba if TYPE_CHECKING: from typing import Any, Sequence @@ -208,15 +208,18 @@ class SpazFactory: # Lets load some basic rules. # (allows them to be tweaked from the master server) - self.shield_decay_rate = _ba.get_v1_account_misc_read_val('rsdr', 10.0) - self.punch_cooldown = _ba.get_v1_account_misc_read_val('rpc', 400) - self.punch_cooldown_gloves = (_ba.get_v1_account_misc_read_val( + self.shield_decay_rate = ba.internal.get_v1_account_misc_read_val( + 'rsdr', 10.0) + self.punch_cooldown = ba.internal.get_v1_account_misc_read_val( + 'rpc', 400) + self.punch_cooldown_gloves = (ba.internal.get_v1_account_misc_read_val( 'rpcg', 300)) - self.punch_power_scale = _ba.get_v1_account_misc_read_val('rpp', 1.2) - self.punch_power_scale_gloves = (_ba.get_v1_account_misc_read_val( - 'rppg', 1.4)) - self.max_shield_spillover_damage = (_ba.get_v1_account_misc_read_val( - 'rsms', 500)) + self.punch_power_scale = ba.internal.get_v1_account_misc_read_val( + 'rpp', 1.2) + self.punch_power_scale_gloves = ( + ba.internal.get_v1_account_misc_read_val('rppg', 1.4)) + self.max_shield_spillover_damage = ( + ba.internal.get_v1_account_misc_read_val('rsms', 500)) def get_style(self, character: str) -> str: """Return the named style for this character. diff --git a/assets/src/ba_data/python/bastd/mainmenu.py b/assets/src/ba_data/python/bastd/mainmenu.py index 4b077318..eb2d1bc0 100644 --- a/assets/src/ba_data/python/bastd/mainmenu.py +++ b/assets/src/ba_data/python/bastd/mainmenu.py @@ -10,6 +10,7 @@ import weakref from typing import TYPE_CHECKING import ba +import ba.internal import _ba if TYPE_CHECKING: @@ -67,7 +68,8 @@ class MainMenuActivity(ba.Activity[ba.Player, ba.Team]): # host is navigating menus while they're just staring at an # empty-ish screen. tval = ba.Lstr(resource='hostIsNavigatingMenusText', - subs=[('${HOST}', _ba.get_v1_account_display_string())]) + subs=[('${HOST}', + ba.internal.get_v1_account_display_string())]) self._host_is_navigating_text = ba.NodeActor( ba.newnode('text', attrs={ @@ -274,7 +276,7 @@ class MainMenuActivity(ba.Activity[ba.Player, ba.Team]): # We now want to wait until we're signed in before fetching news. def _try_fetching_news(self) -> None: - if _ba.get_v1_account_state() == 'signed_in': + if ba.internal.get_v1_account_state() == 'signed_in': self._fetch_news() self._fetch_timer = None @@ -282,7 +284,7 @@ class MainMenuActivity(ba.Activity[ba.Player, ba.Team]): ba.app.main_menu_last_news_fetch_time = time.time() # UPDATE - We now just pull news from MRVs. - news = _ba.get_v1_account_misc_read_val('n', None) + news = ba.internal.get_v1_account_misc_read_val('n', None) if news is not None: self._got_news(news) @@ -762,7 +764,7 @@ class MainMenuActivity(ba.Activity[ba.Player, ba.Team]): }) def _get_custom_logo_tex_name(self) -> str | None: - if _ba.get_v1_account_misc_read_val('easter', False): + if ba.internal.get_v1_account_misc_read_val('easter', False): return 'logoEaster' return None diff --git a/assets/src/ba_data/python/bastd/ui/account/__init__.py b/assets/src/ba_data/python/bastd/ui/account/__init__.py index 1ce8461d..24e4007e 100644 --- a/assets/src/ba_data/python/bastd/ui/account/__init__.py +++ b/assets/src/ba_data/python/bastd/ui/account/__init__.py @@ -4,7 +4,6 @@ from __future__ import annotations -import _ba import ba @@ -12,10 +11,11 @@ def show_sign_in_prompt(account_type: str | None = None) -> None: """Bring up a prompt telling the user they must sign in.""" from bastd.ui.confirm import ConfirmWindow from bastd.ui.account import settings + from ba.internal import sign_in_v1 if account_type == 'Google Play': ConfirmWindow( ba.Lstr(resource='notSignedInGooglePlayErrorText'), - lambda: _ba.sign_in_v1('Google Play'), + lambda: sign_in_v1('Google Play'), ok_text=ba.Lstr(resource='accountSettingsWindow.signInText'), width=460, height=130) diff --git a/assets/src/ba_data/python/bastd/ui/account/link.py b/assets/src/ba_data/python/bastd/ui/account/link.py index f92c9dad..b16f8392 100644 --- a/assets/src/ba_data/python/bastd/ui/account/link.py +++ b/assets/src/ba_data/python/bastd/ui/account/link.py @@ -8,8 +8,8 @@ import copy import time from typing import TYPE_CHECKING -import _ba import ba +import ba.internal if TYPE_CHECKING: from typing import Any @@ -50,7 +50,8 @@ class AccountLinkWindow(ba.Window): autoselect=True, icon=ba.gettexture('crossOut'), iconscale=1.2) - maxlinks = _ba.get_v1_account_misc_read_val('maxLinkAccounts', 5) + maxlinks = ba.internal.get_v1_account_misc_read_val( + 'maxLinkAccounts', 5) ba.textwidget( parent=self._root_widget, position=(self._width * 0.5, self._height * 0.56), @@ -84,17 +85,17 @@ class AccountLinkWindow(ba.Window): def _generate_press(self) -> None: from bastd.ui import account - if _ba.get_v1_account_state() != 'signed_in': + if ba.internal.get_v1_account_state() != 'signed_in': account.show_sign_in_prompt() return ba.screenmessage( ba.Lstr(resource='gatherWindow.requestingAPromoCodeText'), color=(0, 1, 0)) - _ba.add_transaction({ + ba.internal.add_transaction({ 'type': 'ACCOUNT_LINK_CODE_REQUEST', 'expire_time': time.time() + 5 }) - _ba.run_transactions() + ba.internal.run_transactions() def _enter_code_press(self) -> None: from bastd.ui import promocode diff --git a/assets/src/ba_data/python/bastd/ui/account/settings.py b/assets/src/ba_data/python/bastd/ui/account/settings.py index c7cd5704..1c78f6ab 100644 --- a/assets/src/ba_data/python/bastd/ui/account/settings.py +++ b/assets/src/ba_data/python/bastd/ui/account/settings.py @@ -10,6 +10,7 @@ from typing import TYPE_CHECKING import _ba import ba +import ba.internal if TYPE_CHECKING: pass @@ -45,10 +46,10 @@ class AccountSettingsWindow(ba.Window): self._r = 'accountSettingsWindow' self._modal = modal self._needs_refresh = False - self._signed_in = (_ba.get_v1_account_state() == 'signed_in') - self._account_state_num = _ba.get_v1_account_state_num() + self._signed_in = (ba.internal.get_v1_account_state() == 'signed_in') + self._account_state_num = ba.internal.get_v1_account_state_num() self._show_linked = (self._signed_in - and _ba.get_v1_account_misc_read_val( + and ba.internal.get_v1_account_misc_read_val( 'allowAccountLinking2', False)) self._check_sign_in_timer = ba.Timer(1.0, ba.WeakCall(self._update), @@ -58,7 +59,7 @@ class AccountSettingsWindow(ba.Window): # Currently we can only reset achievements on game-center. account_type: str | None if self._signed_in: - account_type = _ba.get_v1_account_type() + account_type = ba.internal.get_v1_account_type() else: account_type = None self._can_reset_achievements = (account_type == 'Game Center') @@ -159,11 +160,12 @@ class AccountSettingsWindow(ba.Window): # Hmm should update this to use get_account_state_num. # Theoretically if we switch from one signed-in account to another # in the background this would break. - account_state_num = _ba.get_v1_account_state_num() - account_state = _ba.get_v1_account_state() + account_state_num = ba.internal.get_v1_account_state_num() + account_state = ba.internal.get_v1_account_state() - show_linked = (self._signed_in and _ba.get_v1_account_misc_read_val( - 'allowAccountLinking2', False)) + show_linked = (self._signed_in + and ba.internal.get_v1_account_misc_read_val( + 'allowAccountLinking2', False)) if (account_state_num != self._account_state_num or self._show_linked != show_linked or self._needs_refresh): @@ -191,8 +193,8 @@ class AccountSettingsWindow(ba.Window): # pylint: disable=cyclic-import from bastd.ui import confirm - account_state = _ba.get_v1_account_state() - account_type = (_ba.get_v1_account_type() + account_state = ba.internal.get_v1_account_state() + account_type = (ba.internal.get_v1_account_type() if account_state == 'signed_in' else 'unknown') is_google = account_type == 'Google Play' @@ -225,8 +227,8 @@ class AccountSettingsWindow(ba.Window): in ['Game Center', 'Game Circle']) game_service_button_space = 60.0 - show_linked_accounts_text = (self._signed_in - and _ba.get_v1_account_misc_read_val( + show_linked_accounts_text = (self._signed_in and + ba.internal.get_v1_account_misc_read_val( 'allowAccountLinking2', False)) linked_accounts_text_space = 60.0 @@ -254,8 +256,8 @@ class AccountSettingsWindow(ba.Window): show_player_profiles_button = self._signed_in player_profiles_button_space = 100.0 - show_link_accounts_button = (self._signed_in - and _ba.get_v1_account_misc_read_val( + show_link_accounts_button = (self._signed_in and + ba.internal.get_v1_account_misc_read_val( 'allowAccountLinking2', False)) link_accounts_button_space = 70.0 @@ -335,7 +337,8 @@ class AccountSettingsWindow(ba.Window): size=(0, 0), text=ba.Lstr( resource='accountSettingsWindow.deviceSpecificAccountText', - subs=[('${NAME}', _ba.get_v1_account_display_string())]), + subs=[('${NAME}', + ba.internal.get_v1_account_display_string())]), scale=0.7, color=(0.5, 0.5, 0.6), maxwidth=self._sub_width * 0.9, @@ -589,7 +592,7 @@ class AccountSettingsWindow(ba.Window): if show_game_service_button: button_width = 300 v -= game_service_button_space * 0.85 - account_type = _ba.get_v1_account_type() + account_type = ba.internal.get_v1_account_type() if account_type == 'Game Center': account_type_name = ba.Lstr(resource='gameCenterText') elif account_type == 'Game Circle': @@ -889,8 +892,8 @@ class AccountSettingsWindow(ba.Window): def _on_achievements_press(self) -> None: # pylint: disable=cyclic-import from bastd.ui import achievements - account_state = _ba.get_v1_account_state() - account_type = (_ba.get_v1_account_type() + account_state = ba.internal.get_v1_account_state() + account_type = (ba.internal.get_v1_account_type() if account_state == 'signed_in' else 'unknown') # for google play we use the built-in UI; otherwise pop up our own if account_type == 'Google Play': @@ -913,9 +916,10 @@ class AccountSettingsWindow(ba.Window): def _have_unlinkable_accounts(self) -> bool: # if this is not present, we haven't had contact from the server so # let's not proceed.. - if _ba.get_public_login_id() is None: + if ba.internal.get_public_login_id() is None: return False - accounts = _ba.get_v1_account_misc_read_val_2('linkedAccounts', []) + accounts = ba.internal.get_v1_account_misc_read_val_2( + 'linkedAccounts', []) return len(accounts) > 1 def _update_unlink_accounts_button(self) -> None: @@ -933,11 +937,12 @@ class AccountSettingsWindow(ba.Window): # if this is not present, we haven't had contact from the server so # let's not proceed.. - if _ba.get_public_login_id() is None: + if ba.internal.get_public_login_id() is None: num = int(time.time()) % 4 accounts_str = num * '.' + (4 - num) * ' ' else: - accounts = _ba.get_v1_account_misc_read_val_2('linkedAccounts', []) + accounts = ba.internal.get_v1_account_misc_read_val_2( + 'linkedAccounts', []) # our_account = _bs.get_v1_account_display_string() # accounts = [a for a in accounts if a != our_account] # accounts_str = u', '.join(accounts) if accounts else @@ -977,7 +982,7 @@ class AccountSettingsWindow(ba.Window): if self._tickets_text is None: return try: - tc_str = str(_ba.get_v1_account_ticket_count()) + tc_str = str(ba.internal.get_v1_account_ticket_count()) except Exception: ba.print_exception() tc_str = '-' @@ -989,7 +994,7 @@ class AccountSettingsWindow(ba.Window): if self._account_name_text is None: return try: - name_str = _ba.get_v1_account_display_string() + name_str = ba.internal.get_v1_account_display_string() except Exception: ba.print_exception() name_str = '??' @@ -1043,7 +1048,7 @@ class AccountSettingsWindow(ba.Window): if ba.app.accounts_v2.have_primary_credentials(): ba.app.accounts_v2.set_primary_credentials(None) else: - _ba.sign_out_v1() + ba.internal.sign_out_v1() cfg = ba.app.config @@ -1061,7 +1066,7 @@ class AccountSettingsWindow(ba.Window): account_type: str, show_test_warning: bool = True) -> None: del show_test_warning # unused - _ba.sign_in_v1(account_type) + ba.internal.sign_in_v1(account_type) # Make note of the type account we're *wanting* to be signed in with. cfg = ba.app.config @@ -1082,7 +1087,7 @@ class AccountSettingsWindow(ba.Window): # FIXME: This would need to happen server-side these days. if self._can_reset_achievements: ba.app.config['Achievements'] = {} - _ba.reset_achievements() + ba.internal.reset_achievements() campaign = getcampaign('Default') campaign.reset() # also writes the config.. campaign = getcampaign('Challenges') diff --git a/assets/src/ba_data/python/bastd/ui/account/unlink.py b/assets/src/ba_data/python/bastd/ui/account/unlink.py index 6cff2c40..84dffb90 100644 --- a/assets/src/ba_data/python/bastd/ui/account/unlink.py +++ b/assets/src/ba_data/python/bastd/ui/account/unlink.py @@ -7,8 +7,8 @@ from __future__ import annotations import time from typing import TYPE_CHECKING -import _ba import ba +import ba.internal if TYPE_CHECKING: from typing import Any @@ -77,11 +77,11 @@ class AccountUnlinkWindow(ba.Window): margin=0, left_border=10) - our_login_id = _ba.get_public_login_id() + our_login_id = ba.internal.get_public_login_id() if our_login_id is None: entries = [] else: - account_infos = _ba.get_v1_account_misc_read_val_2( + account_infos = ba.internal.get_v1_account_misc_read_val_2( 'linkedAccounts2', []) entries = [{ 'name': ai['d'], @@ -108,12 +108,12 @@ class AccountUnlinkWindow(ba.Window): ba.screenmessage(ba.Lstr(resource='pleaseWaitText', fallback_resource='requestingText'), color=(0, 1, 0)) - _ba.add_transaction({ + ba.internal.add_transaction({ 'type': 'ACCOUNT_UNLINK_REQUEST', 'accountID': entry['id'], 'expire_time': time.time() + 5 }) - _ba.run_transactions() + ba.internal.run_transactions() ba.containerwidget(edit=self._root_widget, transition=self._transition_out) diff --git a/assets/src/ba_data/python/bastd/ui/account/v2.py b/assets/src/ba_data/python/bastd/ui/account/v2.py index 1f9fea3b..e240264d 100644 --- a/assets/src/ba_data/python/bastd/ui/account/v2.py +++ b/assets/src/ba_data/python/bastd/ui/account/v2.py @@ -8,6 +8,7 @@ import logging from typing import TYPE_CHECKING import ba +import ba.internal import _ba from efro.error import CommunicationError @@ -81,7 +82,8 @@ class V2SignInWindow(ba.Window): return # Show link(s) the user can use to log in. - address = _ba.get_master_server_address(version=2) + response.url + address = ba.internal.get_master_server_address( + version=2) + response.url address_pretty = address.removeprefix('https://') ba.textwidget( diff --git a/assets/src/ba_data/python/bastd/ui/account/viewer.py b/assets/src/ba_data/python/bastd/ui/account/viewer.py index da5fb741..feefea8f 100644 --- a/assets/src/ba_data/python/bastd/ui/account/viewer.py +++ b/assets/src/ba_data/python/bastd/ui/account/viewer.py @@ -8,6 +8,7 @@ from typing import TYPE_CHECKING import _ba import ba +import ba.internal from bastd.ui import popup if TYPE_CHECKING: @@ -91,8 +92,9 @@ class AccountViewerWindow(popup.PopupWindow): # In cases where the user most likely has a browser/email, lets # offer a 'report this user' button. - if (is_browser_likely_available() and _ba.get_v1_account_misc_read_val( - 'showAccountExtrasMenu', False)): + if (is_browser_likely_available() + and ba.internal.get_v1_account_misc_read_val( + 'showAccountExtrasMenu', False)): self._extras_menu_button = ba.buttonwidget( parent=self.root_widget, @@ -154,11 +156,11 @@ class AccountViewerWindow(popup.PopupWindow): delegate=self) def _on_ban_press(self) -> None: - _ba.add_transaction({ + ba.internal.add_transaction({ 'type': 'BAN_ACCOUNT', 'account': self._account_id }) - _ba.run_transactions() + ba.internal.run_transactions() def _on_report_press(self) -> None: from bastd.ui import report @@ -166,8 +168,8 @@ class AccountViewerWindow(popup.PopupWindow): origin_widget=self._extras_menu_button) def _on_more_press(self) -> None: - ba.open_url(_ba.get_master_server_address() + '/highscores?profile=' + - self._account_id) + ba.open_url(ba.internal.get_master_server_address() + + '/highscores?profile=' + self._account_id) def _on_query_response(self, data: dict[str, Any] | None) -> None: # FIXME: Tidy this up. diff --git a/assets/src/ba_data/python/bastd/ui/appinvite.py b/assets/src/ba_data/python/bastd/ui/appinvite.py index 98ba818a..c266b2b5 100644 --- a/assets/src/ba_data/python/bastd/ui/appinvite.py +++ b/assets/src/ba_data/python/bastd/ui/appinvite.py @@ -10,6 +10,7 @@ from typing import TYPE_CHECKING import _ba import ba +import ba.internal if TYPE_CHECKING: from typing import Any @@ -62,11 +63,11 @@ class AppInviteWindow(ba.Window): 'gatherWindow.earnTicketsForRecommendingText'), subs=[('${COUNT}', str( - _ba.get_v1_account_misc_read_val( + ba.internal.get_v1_account_misc_read_val( 'friendTryTickets', 300))), ('${YOU_COUNT}', str( - _ba.get_v1_account_misc_read_val( + ba.internal.get_v1_account_misc_read_val( 'friendTryAwardTickets', 100)))])) or_text = ba.Lstr(resource='orText', @@ -104,14 +105,14 @@ class AppInviteWindow(ba.Window): on_activate_call=ba.WeakCall(self._send_code)) # kick off a transaction to get our code - _ba.add_transaction( + ba.internal.add_transaction( { 'type': 'FRIEND_PROMO_CODE_REQUEST', 'ali': False, 'expire_time': time.time() + 20 }, callback=ba.WeakCall(self._on_code_result)) - _ba.run_transactions() + ba.internal.run_transactions() def _on_code_result(self, result: dict[str, Any] | None) -> None: if result is not None: @@ -128,18 +129,18 @@ class AppInviteWindow(ba.Window): ba.playsound(ba.getsound('error')) return - if _ba.get_v1_account_state() == 'signed_in': + if ba.internal.get_v1_account_state() == 'signed_in': ba.set_analytics_screen('App Invite UI') _ba.show_app_invite( ba.Lstr(resource='gatherWindow.appInviteTitleText', subs=[('${APP_NAME}', ba.Lstr(resource='titleText')) ]).evaluate(), ba.Lstr(resource='gatherWindow.appInviteMessageText', - subs=[ - ('${COUNT}', str(self._data['tickets'])), - ('${NAME}', _ba.get_v1_account_name().split()[0]), - ('${APP_NAME}', ba.Lstr(resource='titleText')) - ]).evaluate(), self._data['code']) + subs=[('${COUNT}', str(self._data['tickets'])), + ('${NAME}', + ba.internal.get_v1_account_name().split()[0]), + ('${APP_NAME}', ba.Lstr(resource='titleText')) + ]).evaluate(), self._data['code']) else: ba.playsound(ba.getsound('error')) @@ -256,7 +257,8 @@ class ShowFriendCodeWindow(ba.Window): ]).evaluate(), ba.Lstr(resource='gatherWindow.appInviteMessageText', subs=[('${COUNT}', str(self._data['tickets'])), - ('${NAME}', _ba.get_v1_account_name().split()[0]), + ('${NAME}', + ba.internal.get_v1_account_name().split()[0]), ('${APP_NAME}', ba.Lstr(resource='titleText')) ]).evaluate(), self._data['code']) @@ -264,7 +266,7 @@ class ShowFriendCodeWindow(ba.Window): import urllib.parse # If somehow we got signed out. - if _ba.get_v1_account_state() != 'signed_in': + if ba.internal.get_v1_account_state() != 'signed_in': ba.screenmessage(ba.Lstr(resource='notSignedInText'), color=(1, 0, 0)) ba.playsound(ba.getsound('error')) @@ -273,7 +275,7 @@ class ShowFriendCodeWindow(ba.Window): ba.set_analytics_screen('Email Friend Code') subject = (ba.Lstr(resource='gatherWindow.friendHasSentPromoCodeText'). evaluate().replace( - '${NAME}', _ba.get_v1_account_name()).replace( + '${NAME}', ba.internal.get_v1_account_name()).replace( '${APP_NAME}', ba.Lstr(resource='titleText').evaluate()).replace( '${COUNT}', str(self._data['tickets']))) @@ -304,7 +306,7 @@ def handle_app_invites_press(force_code: bool = False) -> None: """(internal)""" app = ba.app do_app_invites = (app.platform == 'android' and app.subplatform == 'google' - and _ba.get_v1_account_misc_read_val( + and ba.internal.get_v1_account_misc_read_val( 'enableAppInvites', False) and not app.on_tv) if force_code: do_app_invites = False @@ -326,11 +328,11 @@ def handle_app_invites_press(force_code: bool = False) -> None: else: ShowFriendCodeWindow(result) - _ba.add_transaction( + ba.internal.add_transaction( { 'type': 'FRIEND_PROMO_CODE_REQUEST', 'ali': False, 'expire_time': time.time() + 10 }, callback=handle_result) - _ba.run_transactions() + ba.internal.run_transactions() diff --git a/assets/src/ba_data/python/bastd/ui/characterpicker.py b/assets/src/ba_data/python/bastd/ui/characterpicker.py index 353ee389..62f78bce 100644 --- a/assets/src/ba_data/python/bastd/ui/characterpicker.py +++ b/assets/src/ba_data/python/bastd/ui/characterpicker.py @@ -7,8 +7,8 @@ from __future__ import annotations import math from typing import TYPE_CHECKING -import _ba import ba +import ba.internal from bastd.ui import popup if TYPE_CHECKING: @@ -156,7 +156,7 @@ class CharacterPicker(popup.PopupWindow): def _on_store_press(self) -> None: from bastd.ui.account import show_sign_in_prompt from bastd.ui.store.browser import StoreBrowserWindow - if _ba.get_v1_account_state() != 'signed_in': + if ba.internal.get_v1_account_state() != 'signed_in': show_sign_in_prompt() return self._transition_out() diff --git a/assets/src/ba_data/python/bastd/ui/continues.py b/assets/src/ba_data/python/bastd/ui/continues.py index e8a04d85..4f907f02 100644 --- a/assets/src/ba_data/python/bastd/ui/continues.py +++ b/assets/src/ba_data/python/bastd/ui/continues.py @@ -9,6 +9,7 @@ from typing import TYPE_CHECKING import _ba import ba +import ba.internal if TYPE_CHECKING: from typing import Any, Callable @@ -149,9 +150,9 @@ class ContinuesWindow(ba.Window): self._on_cancel() return - if _ba.get_v1_account_state() == 'signed_in': + if ba.internal.get_v1_account_state() == 'signed_in': sval = (ba.charstr(ba.SpecialChar.TICKET) + - str(_ba.get_v1_account_ticket_count())) + str(ba.internal.get_v1_account_ticket_count())) else: sval = '?' if self._tickets_text is not None: @@ -183,14 +184,14 @@ class ContinuesWindow(ba.Window): ba.playsound(ba.getsound('error')) else: # If somehow we got signed out... - if _ba.get_v1_account_state() != 'signed_in': + if ba.internal.get_v1_account_state() != 'signed_in': ba.screenmessage(ba.Lstr(resource='notSignedInText'), color=(1, 0, 0)) ba.playsound(ba.getsound('error')) return # If it appears we don't have enough tickets, offer to buy more. - tickets = _ba.get_v1_account_ticket_count() + tickets = ba.internal.get_v1_account_ticket_count() if tickets < self._cost: # FIXME: Should we start the timer back up again after? self._counting_down = False diff --git a/assets/src/ba_data/python/bastd/ui/coop/browser.py b/assets/src/ba_data/python/bastd/ui/coop/browser.py index 2aed369c..70f5dbf7 100644 --- a/assets/src/ba_data/python/bastd/ui/coop/browser.py +++ b/assets/src/ba_data/python/bastd/ui/coop/browser.py @@ -10,6 +10,7 @@ from typing import TYPE_CHECKING import _ba import ba +import ba.internal from bastd.ui.store.button import StoreButton from bastd.ui.league.rankbutton import LeagueRankButton from bastd.ui.store.browser import StoreBrowserWindow @@ -93,7 +94,7 @@ class CoopBrowserWindow(ba.Window): self._tourney_data_up_to_date = False - self._campaign_difficulty = _ba.get_v1_account_misc_val( + self._campaign_difficulty = ba.internal.get_v1_account_misc_val( 'campaignDifficulty', 'easy') super().__init__(root_widget=ba.containerwidget( @@ -234,7 +235,7 @@ class CoopBrowserWindow(ba.Window): self._subcontainer: ba.Widget | None = None # Take note of our account state; we'll refresh later if this changes. - self._account_state_num = _ba.get_v1_account_state_num() + self._account_state_num = ba.internal.get_v1_account_state_num() # Same for fg/bg state. self._fg_state = app.fg_state @@ -252,7 +253,7 @@ class CoopBrowserWindow(ba.Window): # starting point. if (app.accounts_v1.account_tournament_list is not None and app.accounts_v1.account_tournament_list[0] - == _ba.get_v1_account_state_num() and all( + == ba.internal.get_v1_account_state_num() and all( t_id in app.accounts_v1.tournament_info for t_id in app.accounts_v1.account_tournament_list[1])): tourney_data = [ @@ -300,7 +301,7 @@ class CoopBrowserWindow(ba.Window): self._tourney_data_up_to_date = False # If our account state has changed, do a full request. - account_state_num = _ba.get_v1_account_state_num() + account_state_num = ba.internal.get_v1_account_state_num() if account_state_num != self._account_state_num: self._account_state_num = account_state_num self._save_state() @@ -324,7 +325,7 @@ class CoopBrowserWindow(ba.Window): self._fg_state = ba.app.fg_state self._last_tournament_query_time = cur_time self._doing_tournament_query = True - _ba.tournament_query( + ba.internal.tournament_query( args={ 'source': 'coop window refresh', 'numScores': 1 @@ -395,11 +396,9 @@ class CoopBrowserWindow(ba.Window): accounts.cache_tournament_info(tournament_data) # Also cache the current tourney list/order for this account. - accounts.account_tournament_list = (_ba.get_v1_account_state_num(), - [ - e['tournamentID'] - for e in tournament_data - ]) + accounts.account_tournament_list = ( + ba.internal.get_v1_account_state_num(), + [e['tournamentID'] for e in tournament_data]) self._doing_tournament_query = False self._update_for_data(tournament_data) @@ -417,7 +416,7 @@ class CoopBrowserWindow(ba.Window): print('ERROR: invalid campaign difficulty:', difficulty) difficulty = 'easy' self._campaign_difficulty = difficulty - _ba.add_transaction({ + ba.internal.add_transaction({ 'type': 'SET_MISC_VAL', 'name': 'campaignDifficulty', 'value': difficulty @@ -668,7 +667,7 @@ class CoopBrowserWindow(ba.Window): # no tournaments). if self._tournament_button_count == 0: unavailable_text = ba.Lstr(resource='unavailableText') - if _ba.get_v1_account_state() != 'signed_in': + if ba.internal.get_v1_account_state() != 'signed_in': unavailable_text = ba.Lstr( value='${A} (${B})', subs=[('${A}', unavailable_text), @@ -744,8 +743,9 @@ class CoopBrowserWindow(ba.Window): ] # Show easter-egg-hunt either if its easter or we own it. - if _ba.get_v1_account_misc_read_val( - 'easter', False) or _ba.get_purchased('games.easter_egg_hunt'): + if ba.internal.get_v1_account_misc_read_val( + 'easter', + False) or ba.internal.get_purchased('games.easter_egg_hunt'): items = [ 'Challenges:Easter Egg Hunt', 'Challenges:Pro Easter Egg Hunt', @@ -838,7 +838,7 @@ class CoopBrowserWindow(ba.Window): # pylint: disable=cyclic-import from bastd.ui.account import show_sign_in_prompt from bastd.ui.league.rankwindow import LeagueRankWindow - if _ba.get_v1_account_state() != 'signed_in': + if ba.internal.get_v1_account_state() != 'signed_in': show_sign_in_prompt() return self._save_state() @@ -855,7 +855,7 @@ class CoopBrowserWindow(ba.Window): ) -> None: # pylint: disable=cyclic-import from bastd.ui.account import show_sign_in_prompt - if _ba.get_v1_account_state() != 'signed_in': + if ba.internal.get_v1_account_state() != 'signed_in': show_sign_in_prompt() return self._save_state() @@ -893,7 +893,7 @@ class CoopBrowserWindow(ba.Window): if game in ('Challenges:Infinite Runaround', 'Challenges:Infinite Onslaught' ) and not ba.app.accounts_v1.have_pro(): - if _ba.get_v1_account_state() != 'signed_in': + if ba.internal.get_v1_account_state() != 'signed_in': show_sign_in_prompt() else: PurchaseWindow(items=['pro']) @@ -920,8 +920,8 @@ class CoopBrowserWindow(ba.Window): required_purchase = None if (required_purchase is not None - and not _ba.get_purchased(required_purchase)): - if _ba.get_v1_account_state() != 'signed_in': + and not ba.internal.get_purchased(required_purchase)): + if ba.internal.get_v1_account_state() != 'signed_in': show_sign_in_prompt() else: PurchaseWindow(items=[required_purchase]) @@ -937,7 +937,7 @@ class CoopBrowserWindow(ba.Window): from bastd.ui.account import show_sign_in_prompt from bastd.ui.tournamententry import TournamentEntryWindow - if _ba.get_v1_account_state() != 'signed_in': + if ba.internal.get_v1_account_state() != 'signed_in': show_sign_in_prompt() return diff --git a/assets/src/ba_data/python/bastd/ui/coop/gamebutton.py b/assets/src/ba_data/python/bastd/ui/coop/gamebutton.py index fb819f32..6324783b 100644 --- a/assets/src/ba_data/python/bastd/ui/coop/gamebutton.py +++ b/assets/src/ba_data/python/bastd/ui/coop/gamebutton.py @@ -7,7 +7,6 @@ from __future__ import annotations import random from typing import TYPE_CHECKING -import _ba import ba if TYPE_CHECKING: @@ -200,17 +199,17 @@ class GameButton: 'Challenges:Infinite Onslaught') and not ba.app.accounts_v1.have_pro()) or (game in ('Challenges:Meteor Shower', ) - and not _ba.get_purchased('games.meteor_shower')) + and not ba.internal.get_purchased('games.meteor_shower')) or (game in ('Challenges:Target Practice', 'Challenges:Target Practice B') - and not _ba.get_purchased('games.target_practice')) + and not ba.internal.get_purchased('games.target_practice')) or (game in ('Challenges:Ninja Fight', ) - and not _ba.get_purchased('games.ninja_fight')) + and not ba.internal.get_purchased('games.ninja_fight')) or (game in ('Challenges:Pro Ninja Fight', ) - and not _ba.get_purchased('games.ninja_fight')) - or (game in ('Challenges:Easter Egg Hunt', - 'Challenges:Pro Easter Egg Hunt') - and not _ba.get_purchased('games.easter_egg_hunt'))): + and not ba.internal.get_purchased('games.ninja_fight')) or + (game in ('Challenges:Easter Egg Hunt', + 'Challenges:Pro Easter Egg Hunt') + and not ba.internal.get_purchased('games.easter_egg_hunt'))): unlocked = False # Let's tint levels a slightly different color when easy mode diff --git a/assets/src/ba_data/python/bastd/ui/coop/tournamentbutton.py b/assets/src/ba_data/python/bastd/ui/coop/tournamentbutton.py index f443ef23..a78c3f71 100644 --- a/assets/src/ba_data/python/bastd/ui/coop/tournamentbutton.py +++ b/assets/src/ba_data/python/bastd/ui/coop/tournamentbutton.py @@ -499,7 +499,7 @@ class TournamentButton: self.allow_ads = allow_ads = entry['allowAds'] final_fee: int | None = (None if fee_var is None else - _ba.get_v1_account_misc_read_val( + ba.internal.get_v1_account_misc_read_val( fee_var, '?')) final_fee_str: str | ba.Lstr diff --git a/assets/src/ba_data/python/bastd/ui/gather/__init__.py b/assets/src/ba_data/python/bastd/ui/gather/__init__.py index f3a1eb90..d575f5df 100644 --- a/assets/src/ba_data/python/bastd/ui/gather/__init__.py +++ b/assets/src/ba_data/python/bastd/ui/gather/__init__.py @@ -10,6 +10,7 @@ from typing import TYPE_CHECKING import _ba import ba +import ba.internal from bastd.ui.tabs import TabRow if TYPE_CHECKING: @@ -151,7 +152,8 @@ class GatherWindow(ba.Window): tabdefs: list[tuple[GatherWindow.TabID, ba.Lstr]] = [ (self.TabID.ABOUT, ba.Lstr(resource=self._r + '.aboutText')) ] - if _ba.get_v1_account_misc_read_val('enablePublicParties', True): + if ba.internal.get_v1_account_misc_read_val('enablePublicParties', + True): tabdefs.append((self.TabID.INTERNET, ba.Lstr(resource=self._r + '.publicText'))) tabdefs.append( diff --git a/assets/src/ba_data/python/bastd/ui/gather/abouttab.py b/assets/src/ba_data/python/bastd/ui/gather/abouttab.py index a782e6cd..23dfccec 100644 --- a/assets/src/ba_data/python/bastd/ui/gather/abouttab.py +++ b/assets/src/ba_data/python/bastd/ui/gather/abouttab.py @@ -7,7 +7,7 @@ from __future__ import annotations from typing import TYPE_CHECKING import ba -import _ba +import ba.internal from bastd.ui.gather import GatherTab if TYPE_CHECKING: @@ -51,8 +51,8 @@ class AboutGatherTab(GatherTab): include_invite = True msc_scale = 1.1 c_height_2 = min(region_height, string_height * msc_scale + 100) - try_tickets = _ba.get_v1_account_misc_read_val('friendTryTickets', - None) + try_tickets = ba.internal.get_v1_account_misc_read_val( + 'friendTryTickets', None) if try_tickets is None: include_invite = False self._container = ba.containerwidget( @@ -106,7 +106,7 @@ class AboutGatherTab(GatherTab): def _invite_to_try_press(self) -> None: from bastd.ui.account import show_sign_in_prompt from bastd.ui.appinvite import handle_app_invites_press - if _ba.get_v1_account_state() != 'signed_in': + if ba.internal.get_v1_account_state() != 'signed_in': show_sign_in_prompt() return handle_app_invites_press() diff --git a/assets/src/ba_data/python/bastd/ui/gather/privatetab.py b/assets/src/ba_data/python/bastd/ui/gather/privatetab.py index 6e35922d..294f0a5a 100644 --- a/assets/src/ba_data/python/bastd/ui/gather/privatetab.py +++ b/assets/src/ba_data/python/bastd/ui/gather/privatetab.py @@ -12,6 +12,7 @@ from dataclasses import dataclass from typing import TYPE_CHECKING, cast import ba +import ba.internal import _ba from efro.dataclassio import dataclass_from_dict, dataclass_to_dict from bacommon.net import (PrivateHostingState, PrivateHostingConfig, @@ -227,7 +228,7 @@ class PrivateGatherTab(GatherTab): def _update_currency_ui(self) -> None: # Keep currency count up to date if applicable. try: - t_str = str(_ba.get_v1_account_ticket_count()) + t_str = str(ba.internal.get_v1_account_ticket_count()) except Exception: t_str = '?' if self._get_tickets_button: @@ -247,7 +248,7 @@ class PrivateGatherTab(GatherTab): if self._state.sub_tab is SubTabType.HOST: # If we're not signed in, just refresh to show that. - if (_ba.get_v1_account_state() != 'signed_in' + if (ba.internal.get_v1_account_state() != 'signed_in' and self._showing_not_signed_in_screen): self._refresh_sub_tab() else: @@ -256,8 +257,8 @@ class PrivateGatherTab(GatherTab): if (self._last_hosting_state_query_time is None or now - self._last_hosting_state_query_time > 15.0): self._debug_server_comm('querying private party state') - if _ba.get_v1_account_state() == 'signed_in': - _ba.add_transaction( + if ba.internal.get_v1_account_state() == 'signed_in': + ba.internal.add_transaction( { 'type': 'PRIVATE_PARTY_QUERY', 'expire_time': time.time() + 20, @@ -265,7 +266,7 @@ class PrivateGatherTab(GatherTab): callback=ba.WeakCall( self._hosting_state_idle_response), ) - _ba.run_transactions() + ba.internal.run_transactions() else: self._hosting_state_idle_response(None) self._last_hosting_state_query_time = now @@ -438,7 +439,7 @@ class PrivateGatherTab(GatherTab): # pylint: disable=too-many-branches # pylint: disable=too-many-statements - if _ba.get_v1_account_state() != 'signed_in': + if ba.internal.get_v1_account_state() != 'signed_in': ba.textwidget(parent=self._container, size=(0, 0), h_align='center', @@ -762,7 +763,7 @@ class PrivateGatherTab(GatherTab): self._connect_press_time = now self._debug_server_comm('sending private party connect') - _ba.add_transaction( + ba.internal.add_transaction( { 'type': 'PRIVATE_PARTY_CONNECT', 'expire_time': time.time() + 20, @@ -770,14 +771,14 @@ class PrivateGatherTab(GatherTab): }, callback=ba.WeakCall(self._connect_response), ) - _ba.run_transactions() + ba.internal.run_transactions() def _start_stop_button_press(self) -> None: if (self._waiting_for_start_stop_response or self._waiting_for_initial_state): return - if _ba.get_v1_account_state() != 'signed_in': + if ba.internal.get_v1_account_state() != 'signed_in': ba.screenmessage(ba.Lstr(resource='notSignedInErrorText')) ba.playsound(ba.getsound('error')) self._refresh_sub_tab() @@ -796,7 +797,7 @@ class PrivateGatherTab(GatherTab): if self._hostingstate.tickets_to_host_now > 0: ticket_count: int | None try: - ticket_count = _ba.get_v1_account_ticket_count() + ticket_count = ba.internal.get_v1_account_ticket_count() except Exception: # FIXME: should add a ba.NotSignedInError we can use here. ticket_count = None @@ -806,7 +807,7 @@ class PrivateGatherTab(GatherTab): ba.playsound(ba.getsound('error')) return self._last_action_send_time = time.time() - _ba.add_transaction( + ba.internal.add_transaction( { 'type': 'PRIVATE_PARTY_START', 'config': dataclass_to_dict(self._hostingconfig), @@ -814,17 +815,17 @@ class PrivateGatherTab(GatherTab): 'expire_time': time.time() + 20, }, callback=ba.WeakCall(self._hosting_state_response)) - _ba.run_transactions() + ba.internal.run_transactions() else: self._last_action_send_time = time.time() - _ba.add_transaction( + ba.internal.add_transaction( { 'type': 'PRIVATE_PARTY_STOP', 'expire_time': time.time() + 20, }, callback=ba.WeakCall(self._hosting_state_response)) - _ba.run_transactions() + ba.internal.run_transactions() ba.playsound(ba.getsound('click01')) self._waiting_for_start_stop_response = True diff --git a/assets/src/ba_data/python/bastd/ui/gather/publictab.py b/assets/src/ba_data/python/bastd/ui/gather/publictab.py index 726cf9e7..88b55ab3 100644 --- a/assets/src/ba_data/python/bastd/ui/gather/publictab.py +++ b/assets/src/ba_data/python/bastd/ui/gather/publictab.py @@ -14,6 +14,7 @@ from typing import TYPE_CHECKING, cast import _ba import ba +import ba.internal from bastd.ui.gather import GatherTab if TYPE_CHECKING: @@ -88,8 +89,8 @@ class UIRow: if party.clean_display_index == index: return - ping_good = _ba.get_v1_account_misc_read_val('pingGood', 100) - ping_med = _ba.get_v1_account_misc_read_val('pingMed', 500) + ping_good = ba.internal.get_v1_account_misc_read_val('pingGood', 100) + ping_med = ba.internal.get_v1_account_misc_read_val('pingMed', 500) self._clear() hpos = 20 @@ -122,8 +123,8 @@ class UIRow: if party.stats_addr: url = party.stats_addr.replace( '${ACCOUNT}', - _ba.get_v1_account_misc_read_val_2('resolvedAccountID', - 'UNKNOWN')) + ba.internal.get_v1_account_misc_read_val_2( + 'resolvedAccountID', 'UNKNOWN')) self._stats_button = ba.buttonwidget( color=(0.3, 0.6, 0.94), textcolor=(1.0, 1.0, 1.0), @@ -793,7 +794,7 @@ class PublicGatherTab(GatherTab): self._process_pending_party_infos() # Anytime we sign in/out, make sure we refresh our list. - signed_in = _ba.get_v1_account_state() == 'signed_in' + signed_in = ba.internal.get_v1_account_state() == 'signed_in' if self._signed_in != signed_in: self._signed_in = signed_in self._party_lists_dirty = True @@ -986,7 +987,7 @@ class PublicGatherTab(GatherTab): p[1].index)) # If signed out or errored, show no parties. - if (_ba.get_v1_account_state() != 'signed_in' + if (ba.internal.get_v1_account_state() != 'signed_in' or not self._have_valid_server_list): self._parties_displayed = {} else: @@ -1022,20 +1023,21 @@ class PublicGatherTab(GatherTab): # Fire off a new public-party query periodically. if (self._last_server_list_query_time is None - or now - self._last_server_list_query_time > 0.001 * - _ba.get_v1_account_misc_read_val('pubPartyRefreshMS', 10000)): + or now - self._last_server_list_query_time > + 0.001 * ba.internal.get_v1_account_misc_read_val( + 'pubPartyRefreshMS', 10000)): self._last_server_list_query_time = now if DEBUG_SERVER_COMMUNICATION: print('REQUESTING SERVER LIST') - if _ba.get_v1_account_state() == 'signed_in': - _ba.add_transaction( + if ba.internal.get_v1_account_state() == 'signed_in': + ba.internal.add_transaction( { 'type': 'PUBLIC_PARTY_QUERY', 'proto': ba.app.protocol_version, 'lang': ba.app.lang.language }, callback=ba.WeakCall(self._on_public_party_query_result)) - _ba.run_transactions() + ba.internal.run_transactions() else: self._on_public_party_query_result(None) @@ -1156,7 +1158,7 @@ class PublicGatherTab(GatherTab): def _on_start_advertizing_press(self) -> None: from bastd.ui.account import show_sign_in_prompt - if _ba.get_v1_account_state() != 'signed_in': + if ba.internal.get_v1_account_state() != 'signed_in': show_sign_in_prompt() return diff --git a/assets/src/ba_data/python/bastd/ui/getcurrency.py b/assets/src/ba_data/python/bastd/ui/getcurrency.py index bc165171..0b3b2f4d 100644 --- a/assets/src/ba_data/python/bastd/ui/getcurrency.py +++ b/assets/src/ba_data/python/bastd/ui/getcurrency.py @@ -8,6 +8,7 @@ from typing import TYPE_CHECKING import _ba import ba +import ba.internal if TYPE_CHECKING: from typing import Any @@ -176,38 +177,34 @@ class GetCurrencyWindow(ba.Window): rsrc = self._r + '.ticketsText' - c2txt = ba.Lstr( - resource=rsrc, - subs=[('${COUNT}', - str(_ba.get_v1_account_misc_read_val('tickets2Amount', - 500)))]) - c3txt = ba.Lstr( - resource=rsrc, - subs=[ - ('${COUNT}', - str(_ba.get_v1_account_misc_read_val('tickets3Amount', 1500))) - ]) - c4txt = ba.Lstr( - resource=rsrc, - subs=[ - ('${COUNT}', - str(_ba.get_v1_account_misc_read_val('tickets4Amount', 5000))) - ]) - c5txt = ba.Lstr( - resource=rsrc, - subs=[ - ('${COUNT}', - str(_ba.get_v1_account_misc_read_val('tickets5Amount', - 15000))) - ]) + c2txt = ba.Lstr(resource=rsrc, + subs=[('${COUNT}', + str( + ba.internal.get_v1_account_misc_read_val( + 'tickets2Amount', 500)))]) + c3txt = ba.Lstr(resource=rsrc, + subs=[('${COUNT}', + str( + ba.internal.get_v1_account_misc_read_val( + 'tickets3Amount', 1500)))]) + c4txt = ba.Lstr(resource=rsrc, + subs=[('${COUNT}', + str( + ba.internal.get_v1_account_misc_read_val( + 'tickets4Amount', 5000)))]) + c5txt = ba.Lstr(resource=rsrc, + subs=[('${COUNT}', + str( + ba.internal.get_v1_account_misc_read_val( + 'tickets5Amount', 15000)))]) h = 110.0 # enable buttons if we have prices.. - tickets2_price = _ba.get_price('tickets2') - tickets3_price = _ba.get_price('tickets3') - tickets4_price = _ba.get_price('tickets4') - tickets5_price = _ba.get_price('tickets5') + tickets2_price = ba.internal.get_price('tickets2') + tickets3_price = ba.internal.get_price('tickets3') + tickets4_price = ba.internal.get_price('tickets4') + tickets5_price = ba.internal.get_price('tickets5') # TEMP # tickets1_price = '$0.99' @@ -263,11 +260,12 @@ class GetCurrencyWindow(ba.Window): 'ad', position=(h + h_offs, v), size=b_size_3, - label=ba.Lstr(resource=self._r + '.ticketsFromASponsorText', - subs=[('${COUNT}', - str( - _ba.get_v1_account_misc_read_val( - 'sponsorTickets', 5)))]), + label=ba.Lstr( + resource=self._r + '.ticketsFromASponsorText', + subs=[('${COUNT}', + str( + ba.internal.get_v1_account_misc_read_val( + 'sponsorTickets', 5)))]), tex_name='ticketsMore', enabled=self._enable_ad_button, tex_opacity=0.6, @@ -308,7 +306,7 @@ class GetCurrencyWindow(ba.Window): resource='gatherWindow.earnTicketsForRecommendingText', subs=[('${COUNT}', str( - _ba.get_v1_account_misc_read_val( + ba.internal.get_v1_account_misc_read_val( 'sponsorTickets', 5)))]), tex_name='ticketsMore', enabled=True, @@ -431,16 +429,16 @@ class GetCurrencyWindow(ba.Window): import datetime # if we somehow get signed out, just die.. - if _ba.get_v1_account_state() != 'signed_in': + if ba.internal.get_v1_account_state() != 'signed_in': self._back() return - self._ticket_count = _ba.get_v1_account_ticket_count() + self._ticket_count = ba.internal.get_v1_account_ticket_count() # update our incentivized ad button depending on whether ads are # available if self._ad_button is not None: - next_reward_ad_time = _ba.get_v1_account_misc_read_val_2( + next_reward_ad_time = ba.internal.get_v1_account_misc_read_val_2( 'nextRewardAdTime', None) if next_reward_ad_time is not None: next_reward_ad_time = datetime.datetime.utcfromtimestamp( @@ -499,8 +497,8 @@ class GetCurrencyWindow(ba.Window): if ((app.test_build or (app.platform == 'android' and app.subplatform in ['oculus', 'cardboard'])) - and _ba.get_v1_account_misc_read_val('allowAccountLinking2', - False)): + and ba.internal.get_v1_account_misc_read_val( + 'allowAccountLinking2', False)): ba.screenmessage(ba.Lstr(resource=self._r + '.unavailableLinkAccountText'), color=(1, 0.5, 0)) @@ -514,7 +512,7 @@ class GetCurrencyWindow(ba.Window): from bastd.ui import appinvite from ba.internal import master_server_get if item == 'app_invite': - if _ba.get_v1_account_state() != 'signed_in': + if ba.internal.get_v1_account_state() != 'signed_in': account.show_sign_in_prompt() return appinvite.handle_app_invites_press() @@ -559,7 +557,7 @@ class GetCurrencyWindow(ba.Window): if item == 'ad': import datetime # if ads are disabled until some time, error.. - next_reward_ad_time = _ba.get_v1_account_misc_read_val_2( + next_reward_ad_time = ba.internal.get_v1_account_misc_read_val_2( 'nextRewardAdTime', None) if next_reward_ad_time is not None: next_reward_ad_time = datetime.datetime.utcfromtimestamp( @@ -574,7 +572,7 @@ class GetCurrencyWindow(ba.Window): elif self._enable_ad_button: _ba.app.ads.show_ad('tickets') else: - _ba.purchase(item) + ba.internal.purchase(item) def _back(self) -> None: from bastd.ui.store import browser diff --git a/assets/src/ba_data/python/bastd/ui/iconpicker.py b/assets/src/ba_data/python/bastd/ui/iconpicker.py index 9bd98fec..dbe109b4 100644 --- a/assets/src/ba_data/python/bastd/ui/iconpicker.py +++ b/assets/src/ba_data/python/bastd/ui/iconpicker.py @@ -7,8 +7,8 @@ from __future__ import annotations import math from typing import TYPE_CHECKING -import _ba import ba +import ba.internal from bastd.ui import popup if TYPE_CHECKING: @@ -137,7 +137,7 @@ class IconPicker(popup.PopupWindow): def _on_store_press(self) -> None: from bastd.ui.account import show_sign_in_prompt from bastd.ui.store.browser import StoreBrowserWindow - if _ba.get_v1_account_state() != 'signed_in': + if ba.internal.get_v1_account_state() != 'signed_in': show_sign_in_prompt() return self._transition_out() diff --git a/assets/src/ba_data/python/bastd/ui/kiosk.py b/assets/src/ba_data/python/bastd/ui/kiosk.py index c748b608..b17b85c6 100644 --- a/assets/src/ba_data/python/bastd/ui/kiosk.py +++ b/assets/src/ba_data/python/bastd/ui/kiosk.py @@ -8,6 +8,7 @@ from typing import TYPE_CHECKING import _ba import ba +import ba.internal if TYPE_CHECKING: pass @@ -360,7 +361,7 @@ class KioskWindow(ba.Window): def _update(self) -> None: # Kiosk-mode is designed to be used signed-out... try for force # the issue. - if _ba.get_v1_account_state() == 'signed_in': + if ba.internal.get_v1_account_state() == 'signed_in': # _bs.sign_out() # FIXME: Try to delete player profiles here too. pass diff --git a/assets/src/ba_data/python/bastd/ui/league/rankbutton.py b/assets/src/ba_data/python/bastd/ui/league/rankbutton.py index 8509eb8a..99ab7994 100644 --- a/assets/src/ba_data/python/bastd/ui/league/rankbutton.py +++ b/assets/src/ba_data/python/bastd/ui/league/rankbutton.py @@ -8,6 +8,7 @@ from typing import TYPE_CHECKING import _ba import ba +import ba.internal if TYPE_CHECKING: from typing import Any, Callable @@ -94,7 +95,7 @@ class LeagueRankButton: self._smooth_update_timer: ba.Timer | None = None # Take note of our account state; we'll refresh later if this changes. - self._account_state_num = _ba.get_v1_account_state_num() + self._account_state_num = ba.internal.get_v1_account_state_num() self._last_power_ranking_query_time: float | None = None self._doing_power_ranking_query = False self.set_position(position) @@ -224,7 +225,7 @@ class LeagueRankButton: in_top = data is not None and data['rank'] is not None do_percent = False - if data is None or _ba.get_v1_account_state() != 'signed_in': + if data is None or ba.internal.get_v1_account_state() != 'signed_in': self._percent = self._rank = None status_text = '-' elif in_top: @@ -335,7 +336,7 @@ class LeagueRankButton: cur_time = ba.time(ba.TimeType.REAL) # If our account state has changed, refresh our UI. - account_state_num = _ba.get_v1_account_state_num() + account_state_num = ba.internal.get_v1_account_state_num() if account_state_num != self._account_state_num: self._account_state_num = account_state_num @@ -350,7 +351,7 @@ class LeagueRankButton: or cur_time - self._last_power_ranking_query_time > 30.0): self._last_power_ranking_query_time = cur_time self._doing_power_ranking_query = True - _ba.power_ranking_query( + ba.internal.power_ranking_query( callback=ba.WeakCall(self._on_power_ranking_query_response)) def _default_on_activate_call(self) -> None: diff --git a/assets/src/ba_data/python/bastd/ui/league/rankwindow.py b/assets/src/ba_data/python/bastd/ui/league/rankwindow.py index a29f6185..ff8e8bd3 100644 --- a/assets/src/ba_data/python/bastd/ui/league/rankwindow.py +++ b/assets/src/ba_data/python/bastd/ui/league/rankwindow.py @@ -9,6 +9,7 @@ from typing import TYPE_CHECKING import _ba import ba +import ba.internal from bastd.ui import popup as popup_ui if TYPE_CHECKING: @@ -118,7 +119,7 @@ class LeagueRankWindow(ba.Window): self._season: str | None = None # take note of our account state; we'll refresh later if this changes - self._account_state = _ba.get_v1_account_state() + self._account_state = ba.internal.get_v1_account_state() self._refresh() self._restore_state() @@ -155,8 +156,9 @@ class LeagueRankWindow(ba.Window): resource='coopSelectWindow.activenessAllTimeInfoText' if self._season == 'a' else 'coopSelectWindow.activenessInfoText', subs=[('${MAX}', - str(_ba.get_v1_account_misc_read_val('activenessMax', - 1.0)))]) + str( + ba.internal.get_v1_account_misc_read_val( + 'activenessMax', 1.0)))]) confirm.ConfirmWindow(txt, cancel_button=False, width=460, @@ -168,7 +170,7 @@ class LeagueRankWindow(ba.Window): txt = ba.Lstr(resource='coopSelectWindow.proMultInfoText', subs=[('${PERCENT}', str( - _ba.get_v1_account_misc_read_val( + ba.internal.get_v1_account_misc_read_val( 'proPowerRankingBoost', 10))), ('${PRO}', ba.Lstr(resource='store.bombSquadProNameText', @@ -208,7 +210,7 @@ class LeagueRankWindow(ba.Window): cur_time = ba.time(ba.TimeType.REAL) # if our account state has changed, refresh our UI - account_state = _ba.get_v1_account_state() + account_state = ba.internal.get_v1_account_state() if account_state != self._account_state: self._account_state = account_state self._save_state() @@ -242,9 +244,9 @@ class LeagueRankWindow(ba.Window): self._last_power_ranking_query_time = cur_time self._doing_power_ranking_query = True - _ba.power_ranking_query(season=self._requested_season, - callback=ba.WeakCall( - self._on_power_ranking_query_response)) + ba.internal.power_ranking_query( + season=self._requested_season, + callback=ba.WeakCall(self._on_power_ranking_query_response)) def _refresh(self) -> None: # pylint: disable=too-many-statements @@ -352,7 +354,7 @@ class LeagueRankWindow(ba.Window): maxwidth=200) self._activity_mult_button: ba.Widget | None - if _ba.get_v1_account_misc_read_val('act', False): + if ba.internal.get_v1_account_misc_read_val('act', False): self._activity_mult_button = ba.buttonwidget( parent=w_parent, position=(h2 - 60, v2 + 10), @@ -564,7 +566,7 @@ class LeagueRankWindow(ba.Window): self._on_more_press)) def _on_more_press(self) -> None: - our_login_id = _ba.get_public_login_id() + our_login_id = ba.internal.get_public_login_id() # our_login_id = _bs.get_account_misc_read_val_2( # 'resolvedAccountID', None) if not self._can_do_more_button or our_login_id is None: @@ -582,7 +584,7 @@ class LeagueRankWindow(ba.Window): league_str = '&league=' + self._league_url_arg else: league_str = '' - ba.open_url(_ba.get_master_server_address() + + ba.open_url(ba.internal.get_master_server_address() + '/highscores?list=powerRankings&v=2' + league_str + season_str + '&player=' + our_login_id) @@ -602,7 +604,7 @@ class LeagueRankWindow(ba.Window): finished_season_unranked = False self._can_do_more_button = True extra_text = '' - if _ba.get_v1_account_state() != 'signed_in': + if ba.internal.get_v1_account_state() != 'signed_in': status_text = '(' + ba.Lstr( resource='notSignedInText').evaluate() + ')' elif in_top: @@ -789,8 +791,8 @@ class LeagueRankWindow(ba.Window): have_pro = False if data is None else data['p'] pro_mult = 1.0 + float( - _ba.get_v1_account_misc_read_val('proPowerRankingBoost', - 0.0)) * 0.01 + ba.internal.get_v1_account_misc_read_val('proPowerRankingBoost', + 0.0)) * 0.01 # pylint: disable=consider-using-f-string ba.textwidget(edit=self._pro_mult_text, text=' -' if diff --git a/assets/src/ba_data/python/bastd/ui/mainmenu.py b/assets/src/ba_data/python/bastd/ui/mainmenu.py index 4e5c8c52..1f729bb7 100644 --- a/assets/src/ba_data/python/bastd/ui/mainmenu.py +++ b/assets/src/ba_data/python/bastd/ui/mainmenu.py @@ -8,6 +8,7 @@ from __future__ import annotations from typing import TYPE_CHECKING import ba +import ba.internal import _ba if TYPE_CHECKING: @@ -67,9 +68,9 @@ class MainMenuWindow(ba.Window): self._restore_state() # Keep an eye on a few things and refresh if they change. - self._account_state = _ba.get_v1_account_state() - self._account_state_num = _ba.get_v1_account_state_num() - self._account_type = (_ba.get_v1_account_type() + self._account_state = ba.internal.get_v1_account_state() + self._account_state_num = ba.internal.get_v1_account_state_num() + self._account_type = (ba.internal.get_v1_account_type() if self._account_state == 'signed_in' else None) self._refresh_timer = ba.Timer(1.0, ba.WeakCall(self._check_refresh), @@ -122,10 +123,11 @@ class MainMenuWindow(ba.Window): ba.print_exception('Error showing get-remote-app info') def _get_store_char_tex(self) -> str: - return ('storeCharacterXmas' if _ba.get_v1_account_misc_read_val( - 'xmas', False) else - 'storeCharacterEaster' if _ba.get_v1_account_misc_read_val( - 'easter', False) else 'storeCharacter') + return ( + 'storeCharacterXmas' if ba.internal.get_v1_account_misc_read_val( + 'xmas', False) else + 'storeCharacterEaster' if ba.internal.get_v1_account_misc_read_val( + 'easter', False) else 'storeCharacter') def _check_refresh(self) -> None: if not self._root_widget: @@ -138,13 +140,14 @@ class MainMenuWindow(ba.Window): return store_char_tex = self._get_store_char_tex() - account_state_num = _ba.get_v1_account_state_num() + account_state_num = ba.internal.get_v1_account_state_num() if (account_state_num != self._account_state_num or store_char_tex != self._store_char_tex): self._store_char_tex = store_char_tex self._account_state_num = account_state_num - account_state = self._account_state = (_ba.get_v1_account_state()) - self._account_type = (_ba.get_v1_account_type() + account_state = self._account_state = ( + ba.internal.get_v1_account_state()) + self._account_type = (ba.internal.get_v1_account_type() if account_state == 'signed_in' else None) self._save_state() self._refresh() @@ -213,8 +216,8 @@ class MainMenuWindow(ba.Window): on_activate_call=self._settings) # Scattered eggs on easter. - if _ba.get_v1_account_misc_read_val('easter', - False) and not self._in_game: + if ba.internal.get_v1_account_misc_read_val( + 'easter', False) and not self._in_game: icon_size = 34 ba.imagewidget(parent=self._root_widget, position=(h - icon_size * 0.5 - 15, @@ -310,7 +313,7 @@ class MainMenuWindow(ba.Window): transition_delay=self._tdelay) # Scattered eggs on easter. - if _ba.get_v1_account_misc_read_val('easter', False): + if ba.internal.get_v1_account_misc_read_val('easter', False): icon_size = 30 ba.imagewidget(parent=self._root_widget, position=(h - icon_size * 0.5 + 25, @@ -427,8 +430,8 @@ class MainMenuWindow(ba.Window): self._height = 200.0 enable_account_button = True account_type_name: str | ba.Lstr - if _ba.get_v1_account_state() == 'signed_in': - account_type_name = _ba.get_v1_account_display_string() + if ba.internal.get_v1_account_state() == 'signed_in': + account_type_name = ba.internal.get_v1_account_display_string() account_type_icon = None account_textcolor = (1.0, 1.0, 1.0) else: @@ -618,8 +621,8 @@ class MainMenuWindow(ba.Window): enable_sound=account_type_enable_button_sound) # Scattered eggs on easter. - if _ba.get_v1_account_misc_read_val('easter', - False) and not self._in_game: + if ba.internal.get_v1_account_misc_read_val( + 'easter', False) and not self._in_game: icon_size = 32 ba.imagewidget(parent=self._root_widget, position=(h - icon_size * 0.5 + 35, @@ -648,8 +651,8 @@ class MainMenuWindow(ba.Window): self._how_to_play_button = btn # Scattered eggs on easter. - if _ba.get_v1_account_misc_read_val('easter', - False) and not self._in_game: + if ba.internal.get_v1_account_misc_read_val( + 'easter', False) and not self._in_game: icon_size = 28 ba.imagewidget(parent=self._root_widget, position=(h - icon_size * 0.5 + 30, @@ -851,7 +854,7 @@ class MainMenuWindow(ba.Window): # pylint: disable=cyclic-import from bastd.ui.store.browser import StoreBrowserWindow from bastd.ui.account import show_sign_in_prompt - if _ba.get_v1_account_state() != 'signed_in': + if ba.internal.get_v1_account_state() != 'signed_in': show_sign_in_prompt() return self._save_state() diff --git a/assets/src/ba_data/python/bastd/ui/partyqueue.py b/assets/src/ba_data/python/bastd/ui/partyqueue.py index c68878b3..ae8aa3f0 100644 --- a/assets/src/ba_data/python/bastd/ui/partyqueue.py +++ b/assets/src/ba_data/python/bastd/ui/partyqueue.py @@ -10,6 +10,7 @@ from typing import TYPE_CHECKING import _ba import ba +import ba.internal if TYPE_CHECKING: from typing import Any, Sequence @@ -257,11 +258,11 @@ class PartyQueueWindow(ba.Window): def __del__(self) -> None: try: ba.app.ui.have_party_queue_window = False - _ba.add_transaction({ + ba.internal.add_transaction({ 'type': 'PARTY_QUEUE_REMOVE', 'q': self._queue_id }) - _ba.run_transactions() + ba.internal.run_transactions() except Exception: ba.print_exception('Error removing self from party queue.') @@ -320,8 +321,9 @@ class PartyQueueWindow(ba.Window): if -1 not in self._dudes_by_id: dude = self.Dude( self, response['d'], self._initial_offset, True, - _ba.get_v1_account_misc_read_val_2('resolvedAccountID', None), - _ba.get_v1_account_display_string()) + ba.internal.get_v1_account_misc_read_val_2( + 'resolvedAccountID', None), + ba.internal.get_v1_account_display_string()) self._dudes_by_id[-1] = dude self._dudes.append(dude) else: @@ -457,17 +459,17 @@ class PartyQueueWindow(ba.Window): """Boost was pressed.""" from bastd.ui import account from bastd.ui import getcurrency - if _ba.get_v1_account_state() != 'signed_in': + if ba.internal.get_v1_account_state() != 'signed_in': account.show_sign_in_prompt() return - if _ba.get_v1_account_ticket_count() < self._boost_tickets: + if ba.internal.get_v1_account_ticket_count() < self._boost_tickets: ba.playsound(ba.getsound('error')) getcurrency.show_get_tickets_prompt() return ba.playsound(ba.getsound('laserReverse')) - _ba.add_transaction( + ba.internal.add_transaction( { 'type': 'PARTY_QUEUE_BOOST', 't': self._boost_tickets, @@ -497,18 +499,18 @@ class PartyQueueWindow(ba.Window): # Update boost button color based on if we have enough moola. if self._boost_button is not None: - can_boost = ( - (_ba.get_v1_account_state() == 'signed_in' - and _ba.get_v1_account_ticket_count() >= self._boost_tickets)) + can_boost = ((ba.internal.get_v1_account_state() == 'signed_in' + and ba.internal.get_v1_account_ticket_count() >= + self._boost_tickets)) ba.buttonwidget(edit=self._boost_button, color=(0, 1, 0) if can_boost else (0.7, 0.7, 0.7)) # Update ticket-count. if self._tickets_text is not None: if self._boost_button is not None: - if _ba.get_v1_account_state() == 'signed_in': + if ba.internal.get_v1_account_state() == 'signed_in': val = ba.charstr(ba.SpecialChar.TICKET) + str( - _ba.get_v1_account_ticket_count()) + ba.internal.get_v1_account_ticket_count()) else: val = ba.charstr(ba.SpecialChar.TICKET) + '???' ba.textwidget(edit=self._tickets_text, text=val) @@ -517,16 +519,16 @@ class PartyQueueWindow(ba.Window): current_time = ba.time(ba.TimeType.REAL) if (self._last_transaction_time is None - or current_time - self._last_transaction_time > - 0.001 * _ba.get_v1_account_misc_read_val('pqInt', 5000)): + or current_time - self._last_transaction_time > 0.001 * + ba.internal.get_v1_account_misc_read_val('pqInt', 5000)): self._last_transaction_time = current_time - _ba.add_transaction( + ba.internal.add_transaction( { 'type': 'PARTY_QUEUE_QUERY', 'q': self._queue_id }, callback=ba.WeakCall(self.on_update_response)) - _ba.run_transactions() + ba.internal.run_transactions() # step our dudes for dude in self._dudes: diff --git a/assets/src/ba_data/python/bastd/ui/play.py b/assets/src/ba_data/python/bastd/ui/play.py index 6f872f8b..d288552e 100644 --- a/assets/src/ba_data/python/bastd/ui/play.py +++ b/assets/src/ba_data/python/bastd/ui/play.py @@ -8,6 +8,7 @@ from typing import TYPE_CHECKING import _ba import ba +import ba.internal if TYPE_CHECKING: pass @@ -447,7 +448,7 @@ class PlayWindow(ba.Window): # pylint: disable=cyclic-import from bastd.ui.account import show_sign_in_prompt from bastd.ui.coop.browser import CoopBrowserWindow - if _ba.get_v1_account_state() != 'signed_in': + if ba.internal.get_v1_account_state() != 'signed_in': show_sign_in_prompt() return self._save_state() diff --git a/assets/src/ba_data/python/bastd/ui/playlist/addgame.py b/assets/src/ba_data/python/bastd/ui/playlist/addgame.py index 84cd9285..7ff68bc1 100644 --- a/assets/src/ba_data/python/bastd/ui/playlist/addgame.py +++ b/assets/src/ba_data/python/bastd/ui/playlist/addgame.py @@ -8,6 +8,7 @@ from typing import TYPE_CHECKING import _ba import ba +import ba.internal if TYPE_CHECKING: from bastd.ui.playlist.editcontroller import PlaylistEditController @@ -197,7 +198,7 @@ class PlaylistAddGameWindow(ba.Window): def _on_get_more_games_press(self) -> None: from bastd.ui.account import show_sign_in_prompt from bastd.ui.store.browser import StoreBrowserWindow - if _ba.get_v1_account_state() != 'signed_in': + if ba.internal.get_v1_account_state() != 'signed_in': show_sign_in_prompt() return StoreBrowserWindow(modal=True, diff --git a/assets/src/ba_data/python/bastd/ui/playlist/browser.py b/assets/src/ba_data/python/bastd/ui/playlist/browser.py index 5b5270ea..450b770a 100644 --- a/assets/src/ba_data/python/bastd/ui/playlist/browser.py +++ b/assets/src/ba_data/python/bastd/ui/playlist/browser.py @@ -10,6 +10,7 @@ from typing import TYPE_CHECKING import _ba import ba +import ba.internal if TYPE_CHECKING: pass @@ -140,8 +141,9 @@ class PlaylistBrowserWindow(ba.Window): def _ensure_standard_playlists_exist(self) -> None: # On new installations, go ahead and create a few playlists # besides the hard-coded default one: - if not _ba.get_v1_account_misc_val('madeStandardPlaylists', False): - _ba.add_transaction({ + if not ba.internal.get_v1_account_misc_val('madeStandardPlaylists', + False): + ba.internal.add_transaction({ 'type': 'ADD_PLAYLIST', 'playlistType': @@ -175,7 +177,7 @@ class PlaylistBrowserWindow(ba.Window): }, ] }) - _ba.add_transaction({ + ba.internal.add_transaction({ 'type': 'ADD_PLAYLIST', 'playlistType': @@ -226,7 +228,7 @@ class PlaylistBrowserWindow(ba.Window): }, ] }) - _ba.add_transaction({ + ba.internal.add_transaction({ 'type': 'ADD_PLAYLIST', 'playlistType': @@ -255,7 +257,7 @@ class PlaylistBrowserWindow(ba.Window): }, ] }) - _ba.add_transaction({ + ba.internal.add_transaction({ 'type': 'ADD_PLAYLIST', 'playlistType': @@ -274,12 +276,12 @@ class PlaylistBrowserWindow(ba.Window): } }] }) - _ba.add_transaction({ + ba.internal.add_transaction({ 'type': 'SET_MISC_VAL', 'name': 'madeStandardPlaylists', 'value': True }) - _ba.run_transactions() + ba.internal.run_transactions() def _refresh(self) -> None: # FIXME: Should tidy this up. diff --git a/assets/src/ba_data/python/bastd/ui/playlist/customizebrowser.py b/assets/src/ba_data/python/bastd/ui/playlist/customizebrowser.py index 6befcfd3..5a0fd8ac 100644 --- a/assets/src/ba_data/python/bastd/ui/playlist/customizebrowser.py +++ b/assets/src/ba_data/python/bastd/ui/playlist/customizebrowser.py @@ -10,6 +10,7 @@ from typing import TYPE_CHECKING import _ba import ba +import ba.internal if TYPE_CHECKING: from typing import Any @@ -424,12 +425,12 @@ class PlaylistCustomizeBrowserWindow(ba.Window): ba.containerwidget(edit=self._root_widget, transition='out_left') def _do_delete_playlist(self) -> None: - _ba.add_transaction({ + ba.internal.add_transaction({ 'type': 'REMOVE_PLAYLIST', 'playlistType': self._pvars.config_name, 'playlistName': self._selected_playlist_name }) - _ba.run_transactions() + ba.internal.run_transactions() ba.playsound(ba.getsound('shieldDown')) # (we don't use len()-1 here because the default list adds one) @@ -445,7 +446,7 @@ class PlaylistCustomizeBrowserWindow(ba.Window): from bastd.ui.playlist import share # Gotta be signed in for this to work. - if _ba.get_v1_account_state() != 'signed_in': + if ba.internal.get_v1_account_state() != 'signed_in': ba.screenmessage(ba.Lstr(resource='notSignedInErrorText'), color=(1, 0, 0)) ba.playsound(ba.getsound('error')) @@ -477,7 +478,7 @@ class PlaylistCustomizeBrowserWindow(ba.Window): return # Gotta be signed in for this to work. - if _ba.get_v1_account_state() != 'signed_in': + if ba.internal.get_v1_account_state() != 'signed_in': ba.screenmessage(ba.Lstr(resource='notSignedInErrorText'), color=(1, 0, 0)) ba.playsound(ba.getsound('error')) @@ -492,7 +493,7 @@ class PlaylistCustomizeBrowserWindow(ba.Window): if self._selected_playlist_name is None: return - _ba.add_transaction( + ba.internal.add_transaction( { 'type': 'SHARE_PLAYLIST', 'expire_time': time.time() + 5, @@ -501,7 +502,7 @@ class PlaylistCustomizeBrowserWindow(ba.Window): }, callback=ba.WeakCall(self._on_share_playlist_response, self._selected_playlist_name)) - _ba.run_transactions() + ba.internal.run_transactions() ba.screenmessage(ba.Lstr(resource='sharingText')) def _delete_playlist(self) -> None: @@ -582,13 +583,13 @@ class PlaylistCustomizeBrowserWindow(ba.Window): break test_index += 1 - _ba.add_transaction({ + ba.internal.add_transaction({ 'type': 'ADD_PLAYLIST', 'playlistType': self._pvars.config_name, 'playlistName': test_name, 'playlist': copy.deepcopy(plst) }) - _ba.run_transactions() + ba.internal.run_transactions() ba.playsound(ba.getsound('gunCocking')) self._refresh(select_playlist=test_name) diff --git a/assets/src/ba_data/python/bastd/ui/playlist/edit.py b/assets/src/ba_data/python/bastd/ui/playlist/edit.py index 42846d0a..a7ac1358 100644 --- a/assets/src/ba_data/python/bastd/ui/playlist/edit.py +++ b/assets/src/ba_data/python/bastd/ui/playlist/edit.py @@ -7,6 +7,7 @@ from __future__ import annotations from typing import TYPE_CHECKING, cast import ba +import ba.internal import _ba if TYPE_CHECKING: @@ -283,7 +284,7 @@ class PlaylistEditWindow(ba.Window): # If we had an old one, delete it. if self._editcontroller.get_existing_playlist_name() is not None: - _ba.add_transaction({ + ba.internal.add_transaction({ 'type': 'REMOVE_PLAYLIST', 'playlistType': @@ -292,13 +293,13 @@ class PlaylistEditWindow(ba.Window): self._editcontroller.get_existing_playlist_name() }) - _ba.add_transaction({ + ba.internal.add_transaction({ 'type': 'ADD_PLAYLIST', 'playlistType': self._editcontroller.get_config_name(), 'playlistName': new_name, 'playlist': self._editcontroller.get_playlist() }) - _ba.run_transactions() + ba.internal.run_transactions() ba.containerwidget(edit=self._root_widget, transition='out_right') ba.playsound(ba.getsound('gunCocking')) diff --git a/assets/src/ba_data/python/bastd/ui/playlist/mapselect.py b/assets/src/ba_data/python/bastd/ui/playlist/mapselect.py index eecbd1af..d1d1f480 100644 --- a/assets/src/ba_data/python/bastd/ui/playlist/mapselect.py +++ b/assets/src/ba_data/python/bastd/ui/playlist/mapselect.py @@ -9,6 +9,7 @@ from typing import TYPE_CHECKING import _ba import ba +import ba.internal if TYPE_CHECKING: from typing import Any, Callable @@ -210,7 +211,7 @@ class PlaylistMapSelectWindow(ba.Window): def _on_store_press(self) -> None: from bastd.ui import account from bastd.ui.store.browser import StoreBrowserWindow - if _ba.get_v1_account_state() != 'signed_in': + if ba.internal.get_v1_account_state() != 'signed_in': account.show_sign_in_prompt() return StoreBrowserWindow(modal=True, diff --git a/assets/src/ba_data/python/bastd/ui/playlist/share.py b/assets/src/ba_data/python/bastd/ui/playlist/share.py index 084fca6f..9726545e 100644 --- a/assets/src/ba_data/python/bastd/ui/playlist/share.py +++ b/assets/src/ba_data/python/bastd/ui/playlist/share.py @@ -7,8 +7,8 @@ from __future__ import annotations import time from typing import TYPE_CHECKING -import _ba import ba +import ba.internal from bastd.ui import promocode if TYPE_CHECKING: @@ -50,14 +50,14 @@ class SharePlaylistImportWindow(promocode.PromoCodeWindow): transition=self._transition_out) def _do_enter(self) -> None: - _ba.add_transaction( + ba.internal.add_transaction( { 'type': 'IMPORT_PLAYLIST', 'expire_time': time.time() + 5, 'code': ba.textwidget(query=self._text_field) }, callback=ba.WeakCall(self._on_import_response)) - _ba.run_transactions() + ba.internal.run_transactions() ba.screenmessage(ba.Lstr(resource='importingText')) diff --git a/assets/src/ba_data/python/bastd/ui/playoptions.py b/assets/src/ba_data/python/bastd/ui/playoptions.py index d95731ba..d313cbae 100644 --- a/assets/src/ba_data/python/bastd/ui/playoptions.py +++ b/assets/src/ba_data/python/bastd/ui/playoptions.py @@ -8,6 +8,7 @@ from typing import TYPE_CHECKING import _ba import ba +import ba.internal from bastd.ui import popup if TYPE_CHECKING: @@ -350,7 +351,7 @@ class PlayOptionsWindow(popup.PopupWindow): from bastd.ui.teamnamescolors import TeamNamesColorsWindow from bastd.ui.purchase import PurchaseWindow if not ba.app.accounts_v1.have_pro(): - if _ba.get_v1_account_state() != 'signed_in': + if ba.internal.get_v1_account_state() != 'signed_in': show_sign_in_prompt() else: PurchaseWindow(items=['pro']) diff --git a/assets/src/ba_data/python/bastd/ui/profile/browser.py b/assets/src/ba_data/python/bastd/ui/profile/browser.py index 676b4911..ff2c0574 100644 --- a/assets/src/ba_data/python/bastd/ui/profile/browser.py +++ b/assets/src/ba_data/python/bastd/ui/profile/browser.py @@ -8,6 +8,7 @@ from typing import TYPE_CHECKING import _ba import ba +import ba.internal if TYPE_CHECKING: from typing import Any @@ -174,7 +175,8 @@ class ProfileBrowserWindow(ba.Window): from bastd.ui.purchase import PurchaseWindow # Limit to a handful profiles if they don't have pro-options. - max_non_pro_profiles = _ba.get_v1_account_misc_read_val('mnpp', 5) + max_non_pro_profiles = ba.internal.get_v1_account_misc_read_val( + 'mnpp', 5) assert self._profiles is not None if (not ba.app.accounts_v1.have_pro_options() and len(self._profiles) >= max_non_pro_profiles): @@ -221,11 +223,11 @@ class ProfileBrowserWindow(ba.Window): self._do_delete_profile, 350) def _do_delete_profile(self) -> None: - _ba.add_transaction({ + ba.internal.add_transaction({ 'type': 'REMOVE_PLAYER_PROFILE', 'name': self._selected_profile }) - _ba.run_transactions() + ba.internal.run_transactions() ba.playsound(ba.getsound('shieldDown')) self._refresh() @@ -283,8 +285,8 @@ class ProfileBrowserWindow(ba.Window): items.sort(key=lambda x: asserttype(x[0], str).lower()) index = 0 account_name: str | None - if _ba.get_v1_account_state() == 'signed_in': - account_name = _ba.get_v1_account_display_string() + if ba.internal.get_v1_account_state() == 'signed_in': + account_name = ba.internal.get_v1_account_display_string() else: account_name = None widget_to_select = None diff --git a/assets/src/ba_data/python/bastd/ui/profile/edit.py b/assets/src/ba_data/python/bastd/ui/profile/edit.py index 64500c20..7b4a13a6 100644 --- a/assets/src/ba_data/python/bastd/ui/profile/edit.py +++ b/assets/src/ba_data/python/bastd/ui/profile/edit.py @@ -9,6 +9,7 @@ from typing import TYPE_CHECKING, cast import _ba import ba +import ba.internal if TYPE_CHECKING: from bastd.ui.colorpicker import ColorPicker @@ -172,8 +173,8 @@ class EditProfileWindow(ba.Window): self._upgrade_button = None if self._is_account_profile: - if _ba.get_v1_account_state() == 'signed_in': - sval = _ba.get_v1_account_display_string() + if ba.internal.get_v1_account_state() == 'signed_in': + sval = ba.internal.get_v1_account_display_string() else: sval = '??' ba.textwidget(parent=self._root_widget, @@ -426,7 +427,7 @@ class EditProfileWindow(ba.Window): """Attempt to ugrade the profile to global.""" from bastd.ui import account from bastd.ui.profile import upgrade as pupgrade - if _ba.get_v1_account_state() != 'signed_in': + if ba.internal.get_v1_account_state() != 'signed_in': account.show_sign_in_prompt() return @@ -592,8 +593,9 @@ class EditProfileWindow(ba.Window): return name = self.getname() if name == '__account__': - name = (_ba.get_v1_account_name() - if _ba.get_v1_account_state() == 'signed_in' else '???') + name = (ba.internal.get_v1_account_name() + if ba.internal.get_v1_account_state() == 'signed_in' else + '???') if len(name) > 10 and not (self._global or self._is_account_profile): ba.textwidget(edit=self._clipped_name_text, text=ba.Lstr(resource='inGameClippedNameText', @@ -640,7 +642,7 @@ class EditProfileWindow(ba.Window): # Delete old in case we're renaming. if self._existing_profile and self._existing_profile != new_name: - _ba.add_transaction({ + ba.internal.add_transaction({ 'type': 'REMOVE_PLAYER_PROFILE', 'name': self._existing_profile }) @@ -649,7 +651,7 @@ class EditProfileWindow(ba.Window): # new name (will need to re-request it). self._global = False - _ba.add_transaction({ + ba.internal.add_transaction({ 'type': 'ADD_PLAYER_PROFILE', 'name': new_name, 'profile': { @@ -662,7 +664,7 @@ class EditProfileWindow(ba.Window): }) if transition_out: - _ba.run_transactions() + ba.internal.run_transactions() ba.containerwidget(edit=self._root_widget, transition='out_right') ba.app.ui.set_main_menu_window( ProfileBrowserWindow( diff --git a/assets/src/ba_data/python/bastd/ui/profile/upgrade.py b/assets/src/ba_data/python/bastd/ui/profile/upgrade.py index 3142dc96..ffce43ee 100644 --- a/assets/src/ba_data/python/bastd/ui/profile/upgrade.py +++ b/assets/src/ba_data/python/bastd/ui/profile/upgrade.py @@ -8,8 +8,8 @@ import time import weakref from typing import TYPE_CHECKING -import _ba import ba +import ba.internal if TYPE_CHECKING: from typing import Any @@ -126,8 +126,8 @@ class ProfileUpgradeWindow(ba.Window): 'b': ba.app.build_number }, callback=ba.WeakCall(self._profile_check_result)) - self._cost = _ba.get_v1_account_misc_read_val('price.global_profile', - 500) + self._cost = ba.internal.get_v1_account_misc_read_val( + 'price.global_profile', 500) self._status: str | None = 'waiting' self._update_timer = ba.Timer(1.0, ba.WeakCall(self._update), @@ -170,7 +170,7 @@ class ProfileUpgradeWindow(ba.Window): from bastd.ui import getcurrency if self._status is None: # If it appears we don't have enough tickets, offer to buy more. - tickets = _ba.get_v1_account_ticket_count() + tickets = ba.internal.get_v1_account_ticket_count() if tickets < self._cost: ba.playsound(ba.getsound('error')) getcurrency.show_get_tickets_prompt() @@ -193,11 +193,11 @@ class ProfileUpgradeWindow(ba.Window): color=(1, 0, 0)) ba.playsound(ba.getsound('error')) return - _ba.add_transaction({ + ba.internal.add_transaction({ 'type': 'UPGRADE_PROFILE', 'name': self._name }) - _ba.run_transactions() + ba.internal.run_transactions() self._status = 'upgrading' self._upgrade_start_time = time.time() else: @@ -205,7 +205,7 @@ class ProfileUpgradeWindow(ba.Window): def _update(self) -> None: try: - t_str = str(_ba.get_v1_account_ticket_count()) + t_str = str(ba.internal.get_v1_account_ticket_count()) except Exception: t_str = '?' if self._tickets_text is not None: @@ -219,7 +219,7 @@ class ProfileUpgradeWindow(ba.Window): # Once we've kicked off an upgrade attempt and all transactions go # through, we're done. if (self._status == 'upgrading' - and not _ba.have_outstanding_transactions()): + and not ba.internal.have_outstanding_transactions()): self._status = 'exiting' ba.containerwidget(edit=self._root_widget, transition='out_right') edit_profile_window = self._edit_profile_window() diff --git a/assets/src/ba_data/python/bastd/ui/promocode.py b/assets/src/ba_data/python/bastd/ui/promocode.py index dc39078e..78de4978 100644 --- a/assets/src/ba_data/python/bastd/ui/promocode.py +++ b/assets/src/ba_data/python/bastd/ui/promocode.py @@ -7,8 +7,8 @@ from __future__ import annotations import time from typing import TYPE_CHECKING -import _ba import ba +import ba.internal if TYPE_CHECKING: pass @@ -112,9 +112,9 @@ class PromoCodeWindow(ba.Window): if not self._modal: ba.app.ui.set_main_menu_window( AdvancedSettingsWindow(transition='in_left').get_root_widget()) - _ba.add_transaction({ + ba.internal.add_transaction({ 'type': 'PROMO_CODE', 'expire_time': time.time() + 5, 'code': ba.textwidget(query=self._text_field) }) - _ba.run_transactions() + ba.internal.run_transactions() diff --git a/assets/src/ba_data/python/bastd/ui/purchase.py b/assets/src/ba_data/python/bastd/ui/purchase.py index 8b729c73..d28fa5ac 100644 --- a/assets/src/ba_data/python/bastd/ui/purchase.py +++ b/assets/src/ba_data/python/bastd/ui/purchase.py @@ -6,8 +6,8 @@ from __future__ import annotations from typing import TYPE_CHECKING -import _ba import ba +import ba.internal if TYPE_CHECKING: from typing import Any @@ -68,11 +68,11 @@ class PurchaseWindow(ba.Window): pass # not working else: if self._items == ['pro']: - price_str = _ba.get_price(self._items[0]) + price_str = ba.internal.get_price(self._items[0]) pyoffs = -15 else: pyoffs = 0 - price = self._price = _ba.get_v1_account_misc_read_val( + price = self._price = ba.internal.get_v1_account_misc_read_val( 'price.' + str(items[0]), -1) price_str = ba.charstr(ba.SpecialChar.TICKET) + str(price) self._price_text = ba.textwidget(parent=self._root_widget, @@ -121,7 +121,7 @@ class PurchaseWindow(ba.Window): if ba.app.accounts_v1.have_pro(): can_die = True else: - if _ba.get_purchased(self._items[0]): + if ba.internal.get_purchased(self._items[0]): can_die = True if can_die: @@ -130,11 +130,11 @@ class PurchaseWindow(ba.Window): def _purchase(self) -> None: from bastd.ui import getcurrency if self._items == ['pro']: - _ba.purchase('pro') + ba.internal.purchase('pro') else: ticket_count: int | None try: - ticket_count = _ba.get_v1_account_ticket_count() + ticket_count = ba.internal.get_v1_account_ticket_count() except Exception: ticket_count = None if ticket_count is not None and ticket_count < self._price: @@ -143,7 +143,7 @@ class PurchaseWindow(ba.Window): return def do_it() -> None: - _ba.in_game_purchase(self._items[0], self._price) + ba.internal.in_game_purchase(self._items[0], self._price) ba.playsound(ba.getsound('swish')) do_it() diff --git a/assets/src/ba_data/python/bastd/ui/report.py b/assets/src/ba_data/python/bastd/ui/report.py index 1c761157..5dd3aee8 100644 --- a/assets/src/ba_data/python/bastd/ui/report.py +++ b/assets/src/ba_data/python/bastd/ui/report.py @@ -6,6 +6,7 @@ from __future__ import annotations import _ba import ba +import ba.internal class ReportPlayerWindow(ba.Window): @@ -63,7 +64,7 @@ class ReportPlayerWindow(ba.Window): def _on_language_press(self) -> None: from urllib import parse - _ba.add_transaction({ + ba.internal.add_transaction({ 'type': 'REPORT_ACCOUNT', 'reason': 'language', 'account': self._account_id @@ -76,7 +77,7 @@ class ReportPlayerWindow(ba.Window): def _on_cheating_press(self) -> None: from urllib import parse - _ba.add_transaction({ + ba.internal.add_transaction({ 'type': 'REPORT_ACCOUNT', 'reason': 'cheating', 'account': self._account_id diff --git a/assets/src/ba_data/python/bastd/ui/serverdialog.py b/assets/src/ba_data/python/bastd/ui/serverdialog.py index f972d068..40c64436 100644 --- a/assets/src/ba_data/python/bastd/ui/serverdialog.py +++ b/assets/src/ba_data/python/bastd/ui/serverdialog.py @@ -8,6 +8,7 @@ from typing import TYPE_CHECKING import _ba import ba +import ba.internal if TYPE_CHECKING: from typing import Any @@ -76,7 +77,7 @@ class ServerDialogWindow(ba.Window): ba.TimeFormat.MILLISECONDS) - self._starttime < 1000: ba.playsound(ba.getsound('error')) return - _ba.add_transaction({ + ba.internal.add_transaction({ 'type': 'DIALOG_RESPONSE', 'dialogID': self._dialog_id, 'response': 1 @@ -88,7 +89,7 @@ class ServerDialogWindow(ba.Window): ba.TimeFormat.MILLISECONDS) - self._starttime < 1000: ba.playsound(ba.getsound('error')) return - _ba.add_transaction({ + ba.internal.add_transaction({ 'type': 'DIALOG_RESPONSE', 'dialogID': self._dialog_id, 'response': 0 diff --git a/assets/src/ba_data/python/bastd/ui/settings/advanced.py b/assets/src/ba_data/python/bastd/ui/settings/advanced.py index b3835c72..b76d3194 100644 --- a/assets/src/ba_data/python/bastd/ui/settings/advanced.py +++ b/assets/src/ba_data/python/bastd/ui/settings/advanced.py @@ -8,6 +8,7 @@ from typing import TYPE_CHECKING import _ba import ba +import ba.internal from bastd.ui import popup as popup_ui if TYPE_CHECKING: @@ -340,7 +341,7 @@ class AdvancedSettingsWindow(ba.Window): self._update_lang_status() v -= 40 - lang_inform = _ba.get_v1_account_misc_val('langInform', False) + lang_inform = ba.internal.get_v1_account_misc_val('langInform', False) self._language_inform_checkbox = cbw = ba.checkboxwidget( parent=self._subcontainer, @@ -526,12 +527,12 @@ class AdvancedSettingsWindow(ba.Window): color=(1, 1, 0)) def _on_lang_inform_value_change(self, val: bool) -> None: - _ba.add_transaction({ + ba.internal.add_transaction({ 'type': 'SET_MISC_VAL', 'name': 'langInform', 'value': val }) - _ba.run_transactions() + ba.internal.run_transactions() def _on_vr_test_press(self) -> None: from bastd.ui.settings.vrtesting import VRTestingWindow @@ -544,7 +545,7 @@ class AdvancedSettingsWindow(ba.Window): from bastd.ui.settings.nettesting import NetTestingWindow # Net-testing requires a signed in v1 account. - if _ba.get_v1_account_state() != 'signed_in': + if ba.internal.get_v1_account_state() != 'signed_in': ba.screenmessage(ba.Lstr(resource='notSignedInErrorText'), color=(1, 0, 0)) ba.playsound(ba.getsound('error')) @@ -558,7 +559,7 @@ class AdvancedSettingsWindow(ba.Window): def _on_friend_promo_code_press(self) -> None: from bastd.ui import appinvite from bastd.ui import account - if _ba.get_v1_account_state() != 'signed_in': + if ba.internal.get_v1_account_state() != 'signed_in': account.show_sign_in_prompt() return appinvite.handle_app_invites_press() @@ -576,7 +577,7 @@ class AdvancedSettingsWindow(ba.Window): from bastd.ui.account import show_sign_in_prompt # We have to be logged in for promo-codes to work. - if _ba.get_v1_account_state() != 'signed_in': + if ba.internal.get_v1_account_state() != 'signed_in': show_sign_in_prompt() return self._save_state() diff --git a/assets/src/ba_data/python/bastd/ui/settings/nettesting.py b/assets/src/ba_data/python/bastd/ui/settings/nettesting.py index ab2e693d..85788dbe 100644 --- a/assets/src/ba_data/python/bastd/ui/settings/nettesting.py +++ b/assets/src/ba_data/python/bastd/ui/settings/nettesting.py @@ -13,6 +13,7 @@ from typing import TYPE_CHECKING from efro.error import CleanError import _ba import ba +import ba.internal from bastd.ui.settings.testing import TestingWindow if TYPE_CHECKING: @@ -175,12 +176,12 @@ def _run_diagnostics(weakwin: weakref.ref[NetTestingWindow]) -> None: _print_test_results(_dummy_fail) # V1 ping - baseaddr = _ba.get_master_server_address(source=0, version=1) + baseaddr = ba.internal.get_master_server_address(source=0, version=1) _print(f'\nContacting V1 master-server src0 ({baseaddr})...') _print_test_results(lambda: _test_fetch(baseaddr)) # V1 alternate ping - baseaddr = _ba.get_master_server_address(source=1, version=1) + baseaddr = ba.internal.get_master_server_address(source=1, version=1) _print(f'\nContacting V1 master-server src1 ({baseaddr})...') _print_test_results(lambda: _test_fetch(baseaddr)) @@ -189,14 +190,14 @@ def _run_diagnostics(weakwin: weakref.ref[NetTestingWindow]) -> None: for srcid, result in sorted(ba.app.net.v1_ctest_results.items()): _print(f'\nV1 src{srcid} result: {result}') - curv1addr = _ba.get_master_server_address(version=1) + curv1addr = ba.internal.get_master_server_address(version=1) _print(f'\nUsing V1 address: {curv1addr}') _print('\nRunning V1 transaction...') _print_test_results(_test_v1_transaction) # V2 ping - baseaddr = _ba.get_master_server_address(version=2) + baseaddr = ba.internal.get_master_server_address(version=2) _print(f'\nContacting V2 master-server ({baseaddr})...') _print_test_results(lambda: _test_fetch(baseaddr)) @@ -246,7 +247,7 @@ def _dummy_fail() -> None: def _test_v1_transaction() -> None: """Dummy fail test case.""" - if _ba.get_v1_account_state() != 'signed_in': + if ba.internal.get_v1_account_state() != 'signed_in': raise RuntimeError('Not signed in.') starttime = time.monotonic() @@ -263,14 +264,14 @@ def _test_v1_transaction() -> None: def _do_it() -> None: # Fire off a transaction with a callback. - _ba.add_transaction( + ba.internal.add_transaction( { 'type': 'PRIVATE_PARTY_QUERY', 'expire_time': time.time() + 20, }, callback=_cb, ) - _ba.run_transactions() + ba.internal.run_transactions() ba.pushcall(_do_it, from_other_thread=True) diff --git a/assets/src/ba_data/python/bastd/ui/specialoffer.py b/assets/src/ba_data/python/bastd/ui/specialoffer.py index 82a20d43..2a533245 100644 --- a/assets/src/ba_data/python/bastd/ui/specialoffer.py +++ b/assets/src/ba_data/python/bastd/ui/specialoffer.py @@ -9,6 +9,7 @@ from typing import TYPE_CHECKING import _ba import ba +import ba.internal if TYPE_CHECKING: from typing import Any @@ -35,15 +36,15 @@ class SpecialOfferWindow(ba.Window): # Misnomer: 'pro' actually means offer 'pro_sale'. if offer['item'] in ['pro', 'pro_fullprice']: - real_price = _ba.get_price('pro' if offer['item'] == - 'pro_fullprice' else 'pro_sale') + real_price = ba.internal.get_price('pro' if offer['item'] == + 'pro_fullprice' else 'pro_sale') if real_price is None and ba.app.debug_build: print('NOTE: Faking prices for debug build.') real_price = '$1.23' zombie = real_price is None elif isinstance(offer['price'], str): # (a string price implies IAP id) - real_price = _ba.get_price(offer['price']) + real_price = ba.internal.get_price(offer['price']) if real_price is None and ba.app.debug_build: print('NOTE: Faking price for debug build.') real_price = '$1.23' @@ -83,10 +84,10 @@ class SpecialOfferWindow(ba.Window): self._is_bundle_sale = False try: if offer['item'] in ['pro', 'pro_fullprice']: - original_price_str = _ba.get_price('pro') + original_price_str = ba.internal.get_price('pro') if original_price_str is None: original_price_str = '?' - new_price_str = _ba.get_price('pro_sale') + new_price_str = ba.internal.get_price('pro_sale') if new_price_str is None: new_price_str = '?' percent_off_text = '' @@ -95,7 +96,7 @@ class SpecialOfferWindow(ba.Window): if ('bonusTickets' in offer and offer['bonusTickets'] is not None): self._is_bundle_sale = True - original_price = _ba.get_v1_account_misc_read_val( + original_price = ba.internal.get_v1_account_misc_read_val( 'price.' + self._offer_item, 9999) # For pure ticket prices we can show a percent-off. @@ -207,7 +208,7 @@ class SpecialOfferWindow(ba.Window): # Total-value if they supplied it. total_worth_item = offer.get('valueItem', None) if total_worth_item is not None: - price = _ba.get_price(total_worth_item) + price = ba.internal.get_price(total_worth_item) total_worth_price = (get_clean_price(price) if price is not None else None) if total_worth_price is not None: @@ -344,7 +345,7 @@ class SpecialOfferWindow(ba.Window): if _ba.app.accounts_v1.have_pro(): can_die = True else: - if _ba.get_purchased(self._offer_item): + if ba.internal.get_purchased(self._offer_item): can_die = True if can_die: @@ -364,9 +365,9 @@ class SpecialOfferWindow(ba.Window): if not self._root_widget: return sval: str | ba.Lstr - if _ba.get_v1_account_state() == 'signed_in': + if ba.internal.get_v1_account_state() == 'signed_in': sval = (ba.charstr(SpecialChar.TICKET) + - str(_ba.get_v1_account_ticket_count())) + str(ba.internal.get_v1_account_ticket_count())) else: sval = ba.Lstr(resource='getTicketsWindow.titleText') ba.buttonwidget(edit=self._get_tickets_button, label=sval) @@ -374,7 +375,7 @@ class SpecialOfferWindow(ba.Window): def _on_get_more_tickets_press(self) -> None: from bastd.ui import account from bastd.ui import getcurrency - if _ba.get_v1_account_state() != 'signed_in': + if ba.internal.get_v1_account_state() != 'signed_in': account.show_sign_in_prompt() return getcurrency.GetCurrencyWindow(modal=True).get_root_widget() @@ -384,16 +385,16 @@ class SpecialOfferWindow(ba.Window): from bastd.ui import getcurrency from bastd.ui import confirm if self._offer['item'] == 'pro': - _ba.purchase('pro_sale') + ba.internal.purchase('pro_sale') elif self._offer['item'] == 'pro_fullprice': - _ba.purchase('pro') + ba.internal.purchase('pro') elif self._is_bundle_sale: # With bundle sales, the price is the name of the IAP. - _ba.purchase(self._offer['price']) + ba.internal.purchase(self._offer['price']) else: ticket_count: int | None try: - ticket_count = _ba.get_v1_account_ticket_count() + ticket_count = ba.internal.get_v1_account_ticket_count() except Exception: ticket_count = None if (ticket_count is not None @@ -403,8 +404,8 @@ class SpecialOfferWindow(ba.Window): return def do_it() -> None: - _ba.in_game_purchase('offer:' + str(self._offer['id']), - self._offer['price']) + ba.internal.in_game_purchase('offer:' + str(self._offer['id']), + self._offer['price']) ba.playsound(ba.getsound('swish')) confirm.ConfirmWindow(ba.Lstr( @@ -446,7 +447,7 @@ def show_offer() -> bool: if app.special_offer.get('item') == 'pro_fullprice': cfg = app.config cfg['pendingSpecialOffer'] = { - 'a': _ba.get_public_login_id(), + 'a': ba.internal.get_public_login_id(), 'o': app.special_offer } cfg.commit() diff --git a/assets/src/ba_data/python/bastd/ui/store/browser.py b/assets/src/ba_data/python/bastd/ui/store/browser.py index 042a225e..f39f0de8 100644 --- a/assets/src/ba_data/python/bastd/ui/store/browser.py +++ b/assets/src/ba_data/python/bastd/ui/store/browser.py @@ -12,6 +12,7 @@ from typing import TYPE_CHECKING import _ba import ba +import ba.internal if TYPE_CHECKING: from typing import Any, Callable, Sequence @@ -282,10 +283,10 @@ class StoreBrowserWindow(ba.Window): def _restore_purchases(self) -> None: from bastd.ui import account - if _ba.get_v1_account_state() != 'signed_in': + if ba.internal.get_v1_account_state() != 'signed_in': account.show_sign_in_prompt() else: - _ba.restore_purchases() + ba.internal.restore_purchases() def _update_tabs(self) -> None: from ba.internal import (get_available_sale_time, @@ -323,9 +324,9 @@ class StoreBrowserWindow(ba.Window): if not self._root_widget: return sval: str | ba.Lstr - if _ba.get_v1_account_state() == 'signed_in': + if ba.internal.get_v1_account_state() == 'signed_in': sval = ba.charstr(SpecialChar.TICKET) + str( - _ba.get_v1_account_ticket_count()) + ba.internal.get_v1_account_ticket_count()) else: sval = ba.Lstr(resource='getTicketsWindow.titleText') if self._get_tickets_button: @@ -410,7 +411,7 @@ class StoreBrowserWindow(ba.Window): else: if is_ticket_purchase: if result['allow']: - price = _ba.get_v1_account_misc_read_val( + price = ba.internal.get_v1_account_misc_read_val( 'price.' + item, None) if (price is None or not isinstance(price, int) or price <= 0): @@ -419,7 +420,7 @@ class StoreBrowserWindow(ba.Window): ba.playsound(ba.getsound('error')) else: ba.playsound(ba.getsound('click01')) - _ba.in_game_purchase(item, price) + ba.internal.in_game_purchase(item, price) else: if result['reason'] == 'versionTooOld': ba.playsound(ba.getsound('error')) @@ -434,7 +435,7 @@ class StoreBrowserWindow(ba.Window): # Real in-app purchase. else: if result['allow']: - _ba.purchase(item) + ba.internal.purchase(item) else: if result['reason'] == 'versionTooOld': ba.playsound(ba.getsound('error')) @@ -485,7 +486,7 @@ class StoreBrowserWindow(ba.Window): self._last_buy_time) < 2.0: ba.playsound(ba.getsound('error')) else: - if _ba.get_v1_account_state() != 'signed_in': + if ba.internal.get_v1_account_state() != 'signed_in': account.show_sign_in_prompt() else: self._last_buy_time = curtime @@ -499,9 +500,9 @@ class StoreBrowserWindow(ba.Window): self._do_purchase_check('pro' if get_available_sale_time( 'extras') is None else 'pro_sale') else: - price = _ba.get_v1_account_misc_read_val( + price = ba.internal.get_v1_account_misc_read_val( 'price.' + item, None) - our_tickets = _ba.get_v1_account_ticket_count() + our_tickets = ba.internal.get_v1_account_ticket_count() if price is not None and our_tickets < price: ba.playsound(ba.getsound('error')) getcurrency.show_get_tickets_prompt() @@ -540,7 +541,7 @@ class StoreBrowserWindow(ba.Window): if not self._root_widget: return import datetime - sales_raw = _ba.get_v1_account_misc_read_val('sales', {}) + sales_raw = ba.internal.get_v1_account_misc_read_val('sales', {}) sales = {} try: # Look at the current set of sales; filter any with time remaining. @@ -561,7 +562,7 @@ class StoreBrowserWindow(ba.Window): if b_type in ['upgrades.pro', 'pro']: purchased = _ba.app.accounts_v1.have_pro() else: - purchased = _ba.get_purchased(b_type) + purchased = ba.internal.get_purchased(b_type) sale_opacity = 0.0 sale_title_text: str | ba.Lstr = '' @@ -587,10 +588,10 @@ class StoreBrowserWindow(ba.Window): if b_type in ['upgrades.pro', 'pro']: sale_time = get_available_sale_time('extras') if sale_time is not None: - priceraw = _ba.get_price('pro') + priceraw = ba.internal.get_price('pro') price_text_left = (priceraw if priceraw is not None else '?') - priceraw = _ba.get_price('pro_sale') + priceraw = ba.internal.get_price('pro_sale') price_text_right = (priceraw if priceraw is not None else '?') sale_opacity = 1.0 @@ -601,20 +602,20 @@ class StoreBrowserWindow(ba.Window): centi=False, timeformat=ba.TimeFormat.MILLISECONDS) else: - priceraw = _ba.get_price('pro') + priceraw = ba.internal.get_price('pro') price_text = priceraw if priceraw is not None else '?' price_text_left = '' price_text_right = '' else: - price = _ba.get_v1_account_misc_read_val( + price = ba.internal.get_v1_account_misc_read_val( 'price.' + b_type, 0) # Color the button differently if we cant afford this. - if _ba.get_v1_account_state() == 'signed_in': - if _ba.get_v1_account_ticket_count() < price: + if ba.internal.get_v1_account_state() == 'signed_in': + if ba.internal.get_v1_account_ticket_count() < price: color = (0.6, 0.61, 0.6) price_text = ba.charstr(ba.SpecialChar.TICKET) + str( - _ba.get_v1_account_misc_read_val( + ba.internal.get_v1_account_misc_read_val( 'price.' + b_type, '?')) price_text_left = '' price_text_right = '' @@ -1064,7 +1065,7 @@ class StoreBrowserWindow(ba.Window): # pylint: disable=cyclic-import from bastd.ui.account import show_sign_in_prompt from bastd.ui.getcurrency import GetCurrencyWindow - if _ba.get_v1_account_state() != 'signed_in': + if ba.internal.get_v1_account_state() != 'signed_in': show_sign_in_prompt() return self._save_state() diff --git a/assets/src/ba_data/python/bastd/ui/store/button.py b/assets/src/ba_data/python/bastd/ui/store/button.py index b7664645..06d996ee 100644 --- a/assets/src/ba_data/python/bastd/ui/store/button.py +++ b/assets/src/ba_data/python/bastd/ui/store/button.py @@ -7,6 +7,7 @@ from typing import TYPE_CHECKING import _ba import ba +import ba.internal if TYPE_CHECKING: from typing import Any, Sequence, Callable @@ -197,7 +198,7 @@ class StoreButton: # pylint: disable=cyclic-import from bastd.ui.account import show_sign_in_prompt from bastd.ui.store.browser import StoreBrowserWindow - if _ba.get_v1_account_state() != 'signed_in': + if ba.internal.get_v1_account_state() != 'signed_in': show_sign_in_prompt() return StoreBrowserWindow(modal=True, origin_widget=self._button) @@ -216,9 +217,9 @@ class StoreButton: return # Our instance may outlive our UI objects. if self._ticket_text is not None: - if _ba.get_v1_account_state() == 'signed_in': + if ba.internal.get_v1_account_state() == 'signed_in': sval = ba.charstr(SpecialChar.TICKET) + str( - _ba.get_v1_account_ticket_count()) + ba.internal.get_v1_account_ticket_count()) else: sval = '-' ba.textwidget(edit=self._ticket_text, text=sval) @@ -230,13 +231,13 @@ class StoreButton: # ..also look for new style sales. if sale_time is None: import datetime - sales_raw = _ba.get_v1_account_misc_read_val('sales', {}) + sales_raw = ba.internal.get_v1_account_misc_read_val('sales', {}) sale_times = [] try: # Look at the current set of sales; filter any with time # remaining that we don't own. for sale_item, sale_info in list(sales_raw.items()): - if not _ba.get_purchased(sale_item): + if not ba.internal.get_purchased(sale_item): to_end = (datetime.datetime.utcfromtimestamp( sale_info['e']) - datetime.datetime.utcnow()).total_seconds() diff --git a/assets/src/ba_data/python/bastd/ui/store/item.py b/assets/src/ba_data/python/bastd/ui/store/item.py index 5a98eddd..fb00ad41 100644 --- a/assets/src/ba_data/python/bastd/ui/store/item.py +++ b/assets/src/ba_data/python/bastd/ui/store/item.py @@ -5,7 +5,6 @@ from __future__ import annotations from typing import TYPE_CHECKING -import _ba import ba if TYPE_CHECKING: @@ -202,7 +201,7 @@ def instantiate_store_item_display(item_name: str, color=(1, 1, 1), texture=ba.gettexture('ticketsMore'))) bonus_tickets = str( - _ba.get_v1_account_misc_read_val('proBonusTickets', 100)) + ba.internal.get_v1_account_misc_read_val('proBonusTickets', 100)) extra_texts.append( ba.textwidget(parent=parent_widget, draw_controller=btn, @@ -270,11 +269,11 @@ def instantiate_store_item_display(item_name: str, # If we have a 'total-worth' item-id for this id, show that price so # the user knows how much this is worth. - total_worth_item = _ba.get_v1_account_misc_read_val('twrths', - {}).get(item_name) + total_worth_item = ba.internal.get_v1_account_misc_read_val( + 'twrths', {}).get(item_name) total_worth_price: str | None if total_worth_item is not None: - price = _ba.get_price(total_worth_item) + price = ba.internal.get_price(total_worth_item) total_worth_price = (get_clean_price(price) if price is not None else '??') else: diff --git a/assets/src/ba_data/python/bastd/ui/tournamententry.py b/assets/src/ba_data/python/bastd/ui/tournamententry.py index a495792f..2f9d5a14 100644 --- a/assets/src/ba_data/python/bastd/ui/tournamententry.py +++ b/assets/src/ba_data/python/bastd/ui/tournamententry.py @@ -8,6 +8,7 @@ from typing import TYPE_CHECKING import _ba import ba +import ba.internal from bastd.ui import popup if TYPE_CHECKING: @@ -349,13 +350,13 @@ class TournamentEntryWindow(popup.PopupWindow): if not self._running_query and ( (self._last_query_time is None) or (not self._have_valid_data) or (ba.time(ba.TimeType.REAL) - self._last_query_time > 30.0)): - _ba.tournament_query(args={ - 'source': - 'entry window' if self._tournament_activity is None else - 'retry entry window' - }, - callback=ba.WeakCall( - self._on_tournament_query_response)) + ba.internal.tournament_query( + args={ + 'source': + 'entry window' if self._tournament_activity is None + else 'retry entry window' + }, + callback=ba.WeakCall(self._on_tournament_query_response)) self._last_query_time = ba.time(ba.TimeType.REAL) self._running_query = True @@ -376,7 +377,7 @@ class TournamentEntryWindow(popup.PopupWindow): timeformat=ba.TimeFormat.MILLISECONDS)) # Keep price up-to-date and update the button with it. - self._purchase_price = _ba.get_v1_account_misc_read_val( + self._purchase_price = ba.internal.get_v1_account_misc_read_val( self._purchase_price_name, None) ba.textwidget( @@ -424,7 +425,7 @@ class TournamentEntryWindow(popup.PopupWindow): color=(0, 0.8, 0) if enabled else (0.4, 0.4, 0.4)) try: - t_str = str(_ba.get_v1_account_ticket_count()) + t_str = str(ba.internal.get_v1_account_ticket_count()) except Exception: t_str = '?' if self._get_tickets_button: @@ -514,7 +515,7 @@ class TournamentEntryWindow(popup.PopupWindow): # Deny if we don't have enough tickets. ticket_count: int | None try: - ticket_count = _ba.get_v1_account_ticket_count() + ticket_count = ba.internal.get_v1_account_ticket_count() except Exception: # FIXME: should add a ba.NotSignedInError we can use here. ticket_count = None @@ -527,15 +528,15 @@ class TournamentEntryWindow(popup.PopupWindow): cur_time = ba.time(ba.TimeType.REAL, ba.TimeFormat.MILLISECONDS) self._last_ticket_press_time = cur_time assert isinstance(ticket_cost, int) - _ba.in_game_purchase(self._purchase_name, ticket_cost) + ba.internal.in_game_purchase(self._purchase_name, ticket_cost) self._entering = True - _ba.add_transaction({ + ba.internal.add_transaction({ 'type': 'ENTER_TOURNAMENT', 'fee': self._fee, 'tournamentID': self._tournament_id }) - _ba.run_transactions() + ba.internal.run_transactions() self._launch() def _on_pay_with_ad_press(self) -> None: @@ -568,7 +569,7 @@ class TournamentEntryWindow(popup.PopupWindow): # Make sure any transactions the ad added got locally applied # (rewards added, etc.). - _ba.run_transactions() + ba.internal.run_transactions() # If we're already entering the tourney, ignore. if self._entering: @@ -580,19 +581,19 @@ class TournamentEntryWindow(popup.PopupWindow): # This should have awarded us the tournament_entry_ad purchase; # make sure that's present. # (otherwise the server will ignore our tournament entry anyway) - if not _ba.get_purchased('tournament_entry_ad'): + if not ba.internal.get_purchased('tournament_entry_ad'): print('no tournament_entry_ad purchase present in _on_ad_complete') ba.screenmessage(ba.Lstr(resource='errorText'), color=(1, 0, 0)) ba.playsound(ba.getsound('error')) return self._entering = True - _ba.add_transaction({ + ba.internal.add_transaction({ 'type': 'ENTER_TOURNAMENT', 'fee': 'ad', 'tournamentID': self._tournament_id }) - _ba.run_transactions() + ba.internal.run_transactions() self._launch() def _on_get_tickets_press(self) -> None: @@ -614,9 +615,10 @@ class TournamentEntryWindow(popup.PopupWindow): # button if it looks like we're waiting on a purchase or entering # the tournament. if ((ba.time(ba.TimeType.REAL, ba.TimeFormat.MILLISECONDS) - - self._last_ticket_press_time < 6000) and - (_ba.have_outstanding_transactions() - or _ba.get_purchased(self._purchase_name) or self._entering)): + self._last_ticket_press_time < 6000) + and (ba.internal.have_outstanding_transactions() + or ba.internal.get_purchased(self._purchase_name) + or self._entering)): ba.playsound(ba.getsound('error')) return self._transition_out() diff --git a/assets/src/ba_data/python/bastd/ui/tournamentscores.py b/assets/src/ba_data/python/bastd/ui/tournamentscores.py index 609bde07..36625125 100644 --- a/assets/src/ba_data/python/bastd/ui/tournamentscores.py +++ b/assets/src/ba_data/python/bastd/ui/tournamentscores.py @@ -6,8 +6,8 @@ from __future__ import annotations from typing import TYPE_CHECKING -import _ba import ba +import ba.internal from bastd.ui import popup as popup_ui if TYPE_CHECKING: @@ -99,13 +99,13 @@ class TournamentScoresWindow(popup_ui.PopupWindow): ba.containerwidget(edit=self.root_widget, cancel_button=self._cancel_button) - _ba.tournament_query(args={ + ba.internal.tournament_query(args={ 'tournamentIDs': [tournament_id], 'numScores': 50, 'source': 'scores window' }, - callback=ba.WeakCall( - self._on_tournament_query_response)) + callback=ba.WeakCall( + self._on_tournament_query_response)) def _on_tournament_query_response(self, data: dict[str, Any] | None) -> None: diff --git a/src/ballistica/ballistica.cc b/src/ballistica/ballistica.cc index b1992483..b6a4e3e5 100644 --- a/src/ballistica/ballistica.cc +++ b/src/ballistica/ballistica.cc @@ -22,7 +22,7 @@ namespace ballistica { // These are set automatically via script; don't modify them here. -const int kAppBuildNumber = 20762; +const int kAppBuildNumber = 20764; const char* kAppVersion = "1.7.7"; // Our standalone globals. diff --git a/tools/batools/dummymodule.py b/tools/batools/dummymodule.py index 5fb2748e..3f4954a7 100755 --- a/tools/batools/dummymodule.py +++ b/tools/batools/dummymodule.py @@ -752,16 +752,27 @@ def _dummy_module_dirty(mname: str) -> tuple[bool, str]: def update(projroot: str, check: bool, force: bool) -> None: """Update dummy-modules as needed.""" + from pathlib import Path + + from efrotools import getconfig + toolsdir = os.path.abspath(os.path.join(projroot, 'tools')) # Make sure we're running from the project root dir. os.chdir(projroot) + public = getconfig(Path('.'))['public'] + # Force makes no sense in check mode. if force and check: raise Exception('cannot specify both force and check mode') for mname in ('_ba', '_bainternal'): + # Skip internal module in public since it might + # not exist and is read-only anyway. + if mname == '_ba' and public: + continue + outfilename = os.path.abspath( os.path.join(projroot, f'assets/src/ba_data/python/{mname}.py'))