more work-in-progress isolating _bainternal functionality

This commit is contained in:
Eric 2022-09-05 09:28:04 -07:00
parent 266f39e260
commit ca306b57cc
No known key found for this signature in database
GPG Key ID: 89C93F0F8D6D5A98
75 changed files with 1048 additions and 565 deletions

View File

@ -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"
}

View File

@ -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.

View File

@ -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",

View File

@ -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 \

View File

@ -1 +1 @@
126683827977798484003262787310231621875
161826047581351482927423840323346436406

View File

@ -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.

View File

@ -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()

View File

@ -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

View File

@ -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

View File

@ -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()

View File

@ -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()

View File

@ -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:

View File

@ -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(

View File

@ -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
})

View File

@ -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'

View File

@ -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:

View File

@ -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

View File

@ -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()

View File

@ -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)

View File

@ -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')

View File

@ -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

View File

@ -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

View File

@ -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'
]

View File

@ -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']

View File

@ -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

View File

@ -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.

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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')

View File

@ -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)

View File

@ -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(

View File

@ -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.

View File

@ -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()

View File

@ -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()

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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(

View File

@ -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()

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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()

View File

@ -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

View File

@ -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:

View File

@ -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

View File

@ -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()

View File

@ -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:

View File

@ -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()

View File

@ -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,

View File

@ -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.

View File

@ -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)

View File

@ -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'))

View File

@ -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,

View File

@ -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'))

View File

@ -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'])

View File

@ -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

View File

@ -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(

View File

@ -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()

View File

@ -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()

View File

@ -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()

View File

@ -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

View File

@ -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

View File

@ -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()

View File

@ -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)

View File

@ -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()

View File

@ -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()

View File

@ -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()

View File

@ -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:

View File

@ -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()

View File

@ -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:

View File

@ -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.

View File

@ -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'))