From b0f0cc63f552f1ccf7711319c81afa587e40fcfb Mon Sep 17 00:00:00 2001 From: Eric Date: Thu, 15 Sep 2022 20:02:46 -0700 Subject: [PATCH] cloud console now fully operational --- .efrocachemap | 88 +++++++++---------- CHANGELOG.md | 6 +- assets/src/ba_data/python/._ba_sources_hash | 2 +- assets/src/ba_data/python/_ba.py | 17 +++- assets/src/ba_data/python/ba/_bootstrap.py | 2 +- src/ballistica/app/app_flavor.cc | 15 ++-- src/ballistica/ballistica.cc | 27 +++--- src/ballistica/logic/logic.cc | 8 +- src/ballistica/logic/logic.h | 3 +- src/ballistica/networking/network_reader.cc | 2 +- src/ballistica/platform/platform.cc | 2 +- .../python/methods/python_methods_app.cc | 55 ++++++++++-- 12 files changed, 145 insertions(+), 82 deletions(-) diff --git a/.efrocachemap b/.efrocachemap index 9a8a07d8..dbedae2f 100644 --- a/.efrocachemap +++ b/.efrocachemap @@ -3995,50 +3995,50 @@ "assets/src/ba_data/python/ba/_generated/__init__.py": "https://files.ballistica.net/cache/ba1/ee/e8/cad05aa531c7faf7ff7b96db7f6e", "assets/src/ba_data/python/ba/_generated/enums.py": "https://files.ballistica.net/cache/ba1/b2/e5/0ee0561e16257a32830645239f34", "ballisticacore-windows/Generic/BallisticaCore.ico": "https://files.ballistica.net/cache/ba1/89/c0/e32c7d2a35dc9aef57cc73b0911a", - "build/prefab/full/linux_arm64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/f3/e1/0ee9ade5e9943dc4749aa4cc2182", - "build/prefab/full/linux_arm64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/32/4e/a7c1b096c62864641a59e65e7778", - "build/prefab/full/linux_arm64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/6a/f4/8b86611cbaa7237c8a52e8fe6428", - "build/prefab/full/linux_arm64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/13/f5/fa3c97269613316994f0c2134860", - "build/prefab/full/linux_x86_64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/f8/7a/87877003ee3a13ff7cbbf1ec76a2", - "build/prefab/full/linux_x86_64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/81/0c/708a16fff55ee37338b2d87f7620", - "build/prefab/full/linux_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/4a/91/89523b8f155261e0045a6bb6e277", - "build/prefab/full/linux_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/a9/04/da76c8e848852fef1e58577f59e3", - "build/prefab/full/mac_arm64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/dd/ac/33aed9cc1396ccba2111dfed02f6", - "build/prefab/full/mac_arm64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/1a/5a/0f1e671137a2ec60c2df8e95e078", - "build/prefab/full/mac_arm64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/92/50/ec5fbb3f8b9f4a60934f2dacf180", - "build/prefab/full/mac_arm64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/7c/77/a430bf182d5210792716b6dbd8ee", - "build/prefab/full/mac_x86_64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/ef/6b/de6c811fa70bf4d5d1cdfe49eaae", - "build/prefab/full/mac_x86_64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/92/e0/b9b1053231d7323d185298f8caaa", - "build/prefab/full/mac_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/08/ef/c70efcd89a666758437f0736d956", - "build/prefab/full/mac_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/9d/94/1f0d32c943b64ff558f28ad89653", - "build/prefab/full/windows_x86_gui/debug/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/a6/fb/a6e6a78d7b04d547c9c716ff0a8e", - "build/prefab/full/windows_x86_gui/release/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/5a/b0/d0e087fcdf1756a0b9b5bf805f10", - "build/prefab/full/windows_x86_server/debug/dist/BallisticaCoreHeadless.exe": "https://files.ballistica.net/cache/ba1/34/fb/e6c9fb0e20af0ba3376ca2abba29", - "build/prefab/full/windows_x86_server/release/dist/BallisticaCoreHeadless.exe": "https://files.ballistica.net/cache/ba1/b1/8b/5ba626c39ef586f3ba4bfd508181", - "build/prefab/lib/linux_arm64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/d5/f6/d62e6e6d5e7fe1945f08ccbb9a8f", - "build/prefab/lib/linux_arm64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/02/c5/44d0082442b06153a7d7dce4c8ce", - "build/prefab/lib/linux_arm64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/d0/00/61378fb26ddcbf023fd3c40e4ffb", - "build/prefab/lib/linux_arm64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/0a/e2/a01a2de0835fee06fd7b357c700f", - "build/prefab/lib/linux_x86_64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/7a/dd/8a8f84d8ed28fec12137f632e9f7", - "build/prefab/lib/linux_x86_64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/6d/b1/34d06bce1b93bcefc4896bd2700a", - "build/prefab/lib/linux_x86_64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/63/61/f48cc804658071c759398f9c00dd", - "build/prefab/lib/linux_x86_64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/a2/b7/a28b8ed7c1f13b53dea1c878c5fc", - "build/prefab/lib/mac_arm64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/a5/b2/f29c2fe15f33441de94331743353", - "build/prefab/lib/mac_arm64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/c2/63/bf93d39adb82748decfdb980b562", - "build/prefab/lib/mac_arm64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/00/6d/ac55bffd774cf75c5944b679194a", - "build/prefab/lib/mac_arm64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/7b/dd/af154cabc6779257a38ea6c9e833", - "build/prefab/lib/mac_x86_64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/54/88/2de2dfa2c0c0a1766fa0d5f26ed6", - "build/prefab/lib/mac_x86_64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/ff/26/da4a58abecf5d9275477eaec0c17", - "build/prefab/lib/mac_x86_64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/62/5d/8658a206b8c9b741be2422162784", - "build/prefab/lib/mac_x86_64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/fc/57/d59920e098d23a2d150c899cde29", - "build/prefab/lib/windows/Debug_Win32/BallisticaCoreGenericInternal.lib": "https://files.ballistica.net/cache/ba1/39/a1/bce547622da143fcf9ea970cd3ab", - "build/prefab/lib/windows/Debug_Win32/BallisticaCoreGenericInternal.pdb": "https://files.ballistica.net/cache/ba1/d6/f3/8ca052a667342e316fa09655bc51", - "build/prefab/lib/windows/Debug_Win32/BallisticaCoreHeadlessInternal.lib": "https://files.ballistica.net/cache/ba1/e0/b4/99c403ccbfd0c4b9b071e656d480", - "build/prefab/lib/windows/Debug_Win32/BallisticaCoreHeadlessInternal.pdb": "https://files.ballistica.net/cache/ba1/11/a0/e06103dae63a4648850bd089aacb", - "build/prefab/lib/windows/Release_Win32/BallisticaCoreGenericInternal.lib": "https://files.ballistica.net/cache/ba1/77/17/99eba0c7d42a9452306f7927ae4e", - "build/prefab/lib/windows/Release_Win32/BallisticaCoreGenericInternal.pdb": "https://files.ballistica.net/cache/ba1/92/da/2faf9031e7c5ba5a99dd9e0c609d", - "build/prefab/lib/windows/Release_Win32/BallisticaCoreHeadlessInternal.lib": "https://files.ballistica.net/cache/ba1/64/2a/1b30ee7b4e8238ec2ea16bcacdeb", - "build/prefab/lib/windows/Release_Win32/BallisticaCoreHeadlessInternal.pdb": "https://files.ballistica.net/cache/ba1/41/92/35b689da32ee45a4e7483feae8f8", + "build/prefab/full/linux_arm64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/be/84/d4a9f2698852d47204eaf7f989f9", + "build/prefab/full/linux_arm64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/9d/07/10910a8e3de0506be787ef3ecc48", + "build/prefab/full/linux_arm64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/8d/f7/74d2f4c962b7797e05e15241deac", + "build/prefab/full/linux_arm64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/ea/34/0929f2c03752ac2a4a08a09941ce", + "build/prefab/full/linux_x86_64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/ea/28/a19ef25c15ee6befb9ed2bac5ebc", + "build/prefab/full/linux_x86_64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/38/ad/c3b76ff4f8ca715c394b3a96a68e", + "build/prefab/full/linux_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/f6/8a/98649959fb2bed45dcdc31e841f1", + "build/prefab/full/linux_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/44/97/9d70590ffcde8df0f2f45f0d649a", + "build/prefab/full/mac_arm64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/e2/38/12cf8e7010aa0f4217b0da33786a", + "build/prefab/full/mac_arm64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/c0/a4/c4d1a04cd841065bf2c7a6e8328a", + "build/prefab/full/mac_arm64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/22/f3/613572189769a6d22e00f28125ae", + "build/prefab/full/mac_arm64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/ae/e1/c81f46c7b2933a4caa4e028de174", + "build/prefab/full/mac_x86_64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/90/f7/c2f34b478a63e4d6a48804fec09e", + "build/prefab/full/mac_x86_64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/7d/e5/df47bf427dcb312a85359e4aa15a", + "build/prefab/full/mac_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/49/7d/1a911685c12684b0bb44d85d91b5", + "build/prefab/full/mac_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/49/12/cb7f8ab099507df99d36447bb091", + "build/prefab/full/windows_x86_gui/debug/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/72/de/79b34ded132e59aa48f2c1badd3f", + "build/prefab/full/windows_x86_gui/release/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/3e/91/085afe517b6e54087a746e980cab", + "build/prefab/full/windows_x86_server/debug/dist/BallisticaCoreHeadless.exe": "https://files.ballistica.net/cache/ba1/f8/1b/996fb6d29251b1dd4f72da7d3cdf", + "build/prefab/full/windows_x86_server/release/dist/BallisticaCoreHeadless.exe": "https://files.ballistica.net/cache/ba1/ea/f6/b68573135f10e1c22b60b4b924b7", + "build/prefab/lib/linux_arm64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/f2/f2/5d17e1c169a07365442920c41d5b", + "build/prefab/lib/linux_arm64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/b4/c3/d87cbbb96ae6b8d04c2e47575493", + "build/prefab/lib/linux_arm64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/9c/b1/63bb857c299b7df59bf8c7a839b3", + "build/prefab/lib/linux_arm64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/e5/55/152d7f63e1c7fa017fdbaf6cd01b", + "build/prefab/lib/linux_x86_64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/7c/42/25dd5f85ac0766821786b56356dd", + "build/prefab/lib/linux_x86_64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/4b/3d/cbeddd984dd7bbf651489eaf73d4", + "build/prefab/lib/linux_x86_64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/90/6a/93e4582a5fccca73245a6339c876", + "build/prefab/lib/linux_x86_64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/38/91/32d4dd319c6de2e1202160be1cdb", + "build/prefab/lib/mac_arm64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/93/65/8de22b09531bbd52f3c248dcf479", + "build/prefab/lib/mac_arm64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/c0/c7/18c3deef4709d9e6dc7c02b8e957", + "build/prefab/lib/mac_arm64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/dd/75/443cea54dd7011aded225197675e", + "build/prefab/lib/mac_arm64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/c2/ed/8683ec69a8b55c056808474388d4", + "build/prefab/lib/mac_x86_64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/0d/ad/107f9828c8b195ab08a0a777d1b9", + "build/prefab/lib/mac_x86_64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/49/c3/4dd10b0ac3c1ce9cd3c565e62e4f", + "build/prefab/lib/mac_x86_64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/2f/e6/cf0b3c061fe0428f11f19ab71cd3", + "build/prefab/lib/mac_x86_64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/c5/63/af3ae0a72c0802afaa3fd20bc72d", + "build/prefab/lib/windows/Debug_Win32/BallisticaCoreGenericInternal.lib": "https://files.ballistica.net/cache/ba1/43/bb/33be7bb757f0419a626c72a2aca5", + "build/prefab/lib/windows/Debug_Win32/BallisticaCoreGenericInternal.pdb": "https://files.ballistica.net/cache/ba1/35/28/94b54429a9f282007dcba702684b", + "build/prefab/lib/windows/Debug_Win32/BallisticaCoreHeadlessInternal.lib": "https://files.ballistica.net/cache/ba1/cf/89/8d35a30a72386d6753dd5a9568cb", + "build/prefab/lib/windows/Debug_Win32/BallisticaCoreHeadlessInternal.pdb": "https://files.ballistica.net/cache/ba1/d9/1f/0924eea724878da3d60fda65a73f", + "build/prefab/lib/windows/Release_Win32/BallisticaCoreGenericInternal.lib": "https://files.ballistica.net/cache/ba1/1f/e4/2dd5f92598580490a86b1dd36443", + "build/prefab/lib/windows/Release_Win32/BallisticaCoreGenericInternal.pdb": "https://files.ballistica.net/cache/ba1/ba/12/35d07a2bda668aec5d99813e1f67", + "build/prefab/lib/windows/Release_Win32/BallisticaCoreHeadlessInternal.lib": "https://files.ballistica.net/cache/ba1/a5/b0/f014e1bc0a352fe9402d4c879a04", + "build/prefab/lib/windows/Release_Win32/BallisticaCoreHeadlessInternal.pdb": "https://files.ballistica.net/cache/ba1/63/ed/9565716b18e47dbb13752e68e068", "src/ballistica/generated/python_embedded/binding.inc": "https://files.ballistica.net/cache/ba1/c0/32/b7907e3859a5c5013a3d97b6b523", "src/ballistica/generated/python_embedded/bootstrap.inc": "https://files.ballistica.net/cache/ba1/2d/4f/f4fe67827f36cd59cd5193333a02", "src/ballistica/generated/python_embedded/bootstrap_monolithic.inc": "https://files.ballistica.net/cache/ba1/ef/c1/aa5f1aa10af89f5c0b1e616355fd" diff --git a/CHANGELOG.md b/CHANGELOG.md index ce73993d..e5c5f5a7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -### 1.7.7 (build 20857, api 7, 2022-09-15) +### 1.7.7 (build 20858, api 7, 2022-09-15) - 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. @@ -35,8 +35,8 @@ - Added `_ba.display_log()` function which ships a log message to the in-game terminal and platform-specific places like the Android log. The engine wires up standard Python logging output to go through this. - Added `_ba.v1_cloud_log()` which ships a message to the old v1-cloud-log (the log which is gathered and sent to the v1 master server to help me identify problems people are seeing). This is presently wired up to a subset of Python logging output to approximate how it used to work. - Note: Previously in the C++ layer some code would mix Python print calls (such as PyErr_PrintEx()) with ballistica::Log() calls. Previously these all wound up going to the same place (Python's sys.stderr) so it worked, but now they no longer do and so this sort of mixing should be avoided. So if you see a weird combination of colored log output lines with non-colored lines that seem to go together, please holler as it means something needs to be fixed. -- Builds for Apple devices now set a thread stack size of 1MB. The default there is 512k and I was seeing some stack overflows for heavy Physics sims or very recursive Python stuff. -- If you want to grab recent logs, you can now use `ba.app.log_handler.get_cached()` This will give you everything that has gone through Python logging, Python stdout/stderr, and the C++ Log() call (up to the max cache size that is). +- Builds for Apple devices now explicitly set a thread stack size of 1MB. The default there is 512k and I was seeing some stack overflows for heavy physics sims or very recursive Python stuff. +- If you want to grab recent logs, you can now use `ba.app.log_handler.get_cached()`. This will give you everything that has gone through Python logging, Python stdout/stderr, and the C++ Log() call (up to the max cache size that is). ### 1.7.6 (build 20687, api 7, 2022-08-11) diff --git a/assets/src/ba_data/python/._ba_sources_hash b/assets/src/ba_data/python/._ba_sources_hash index 8eee74b6..ac8e879b 100644 --- a/assets/src/ba_data/python/._ba_sources_hash +++ b/assets/src/ba_data/python/._ba_sources_hash @@ -1 +1 @@ -41453813326605937968225345803585801012 \ No newline at end of file +202727985408399627040353071391998113840 \ No newline at end of file diff --git a/assets/src/ba_data/python/_ba.py b/assets/src/ba_data/python/_ba.py index 0f4b6cb3..2f751fc3 100644 --- a/assets/src/ba_data/python/_ba.py +++ b/assets/src/ba_data/python/_ba.py @@ -1131,6 +1131,11 @@ def android_show_wifi_settings() -> None: return None +def app_instance_uuid() -> str: + """(internal)""" + return str() + + def apply_config() -> None: """(internal)""" return None @@ -2388,7 +2393,8 @@ def printobjects() -> None: def pushcall(call: Callable, from_other_thread: bool = False, - suppress_other_thread_warning: bool = False) -> None: + suppress_other_thread_warning: bool = False, + other_thread_use_fg_context: bool = False) -> None: """Pushes a call onto the event loop to be run during the next cycle. Category: **General Utility Functions** @@ -2401,7 +2407,9 @@ def pushcall(call: Callable, If you want to push a call from outside of the logic thread, however, you can pass 'from_other_thread' as True. In this case - the call will always run in the UI context on the logic thread. + the call will always run in the UI context on the logic thread + or whichever context is in the foreground if + other_thread_use_fg_context is True. """ return None @@ -2972,6 +2980,11 @@ def unlock_all_input() -> None: return None +def user_ran_commands() -> None: + """(internal)""" + return None + + def v1_cloud_log(message: str) -> None: """(internal) diff --git a/assets/src/ba_data/python/ba/_bootstrap.py b/assets/src/ba_data/python/ba/_bootstrap.py index d3089177..0b044b41 100644 --- a/assets/src/ba_data/python/ba/_bootstrap.py +++ b/assets/src/ba_data/python/ba/_bootstrap.py @@ -44,7 +44,7 @@ def bootstrap() -> None: # Give a soft warning if we're being used with a different binary # version than we expect. - expected_build = 20857 + expected_build = 20858 running_build: int = env['build_number'] if running_build != expected_build: print( diff --git a/src/ballistica/app/app_flavor.cc b/src/ballistica/app/app_flavor.cc index 24223550..70614020 100644 --- a/src/ballistica/app/app_flavor.cc +++ b/src/ballistica/app/app_flavor.cc @@ -368,16 +368,19 @@ void AppFlavor::OnAppStart() { assert(g_input); // If we're running in a terminal, print some info. - if (g_platform->is_stdin_a_terminal()) { + // if (g_platform->is_stdin_a_terminal()) { + { + char buffer[256]; if (g_buildconfig.headless_build()) { - printf("BallisticaCore Headless %s build %d.\n", kAppVersion, - kAppBuildNumber); - fflush(stdout); + snprintf(buffer, sizeof(buffer), "BallisticaCore Headless %s build %d.", + kAppVersion, kAppBuildNumber); } else { - printf("BallisticaCore %s build %d.\n", kAppVersion, kAppBuildNumber); - fflush(stdout); + snprintf(buffer, sizeof(buffer), "BallisticaCore %s build %d.", + kAppVersion, kAppBuildNumber); } + Log(LogLevel::kInfo, buffer); } + // } // If we've got a nice themed hardware cursor, show it. // Otherwise, hide the hardware cursor; we'll draw it in software. diff --git a/src/ballistica/ballistica.cc b/src/ballistica/ballistica.cc index 676a9493..d35e6928 100644 --- a/src/ballistica/ballistica.cc +++ b/src/ballistica/ballistica.cc @@ -32,7 +32,7 @@ namespace ballistica { // These are set automatically via script; don't modify them here. -const int kAppBuildNumber = 20857; +const int kAppBuildNumber = 20858; const char* kAppVersion = "1.7.7"; // Our standalone globals. @@ -252,32 +252,35 @@ auto FatalError(const std::string& message) -> void { BA_PRECONDITION(handled); } +// FIXME: move this to g_app or whatnot. auto GetAppInstanceUUID() -> const std::string& { - static std::string session_id; - static bool have_session_id = false; + static std::string app_instance_uuid; + static bool have_app_instance_uuid = false; - if (!have_session_id) { + if (!have_app_instance_uuid) { if (g_python) { Python::ScopedInterpreterLock gil; auto uuid = g_python->obj(Python::ObjID::kUUIDStrCall).Call(); if (uuid.exists()) { - session_id = uuid.ValueAsString().c_str(); - have_session_id = true; + app_instance_uuid = uuid.ValueAsString().c_str(); + have_app_instance_uuid = true; } } - if (!have_session_id) { + if (!have_app_instance_uuid) { // As an emergency fallback simply use a single random number. + // We should probably simply disallow this before Python is up. Log(LogLevel::kWarning, "GetSessionUUID() using rand fallback."); srand(static_cast( - Platform::GetCurrentMilliseconds())); // NOLINT - session_id = std::to_string(static_cast(rand())); // NOLINT - have_session_id = true; + Platform::GetCurrentMilliseconds())); // NOLINT + app_instance_uuid = + std::to_string(static_cast(rand())); // NOLINT + have_app_instance_uuid = true; } - if (session_id.size() >= 100) { + if (app_instance_uuid.size() >= 100) { Log(LogLevel::kWarning, "session id longer than it should be."); } } - return session_id; + return app_instance_uuid; } auto InMainThread() -> bool { diff --git a/src/ballistica/logic/logic.cc b/src/ballistica/logic/logic.cc index c40a3d9e..5c5acdb5 100644 --- a/src/ballistica/logic/logic.cc +++ b/src/ballistica/logic/logic.cc @@ -913,7 +913,7 @@ void Logic::PushInGameConsoleScriptCommand(const std::string& command) { thread()->PushCall([this, command] { // These are always run in whichever context is 'visible'. ScopedSetContext cp(GetForegroundContext()); - PythonCommand cmd(command, ""); + PythonCommand cmd(command, ""); if (!g_app->user_ran_commands) { g_app->user_ran_commands = true; } @@ -1046,13 +1046,13 @@ void Logic::PushPythonWeakCallArgs( }); } -void Logic::PushPythonRawCallable(PyObject* callable) { - thread()->PushCall([this, callable] { +void Logic::PushPythonRawCallable(PyObject* callable, bool fg_context) { + thread()->PushCall([this, callable, fg_context] { assert(InLogicThread()); // Lets run this in the UI context. // (can add other options if we need later) - ScopedSetContext cp(GetUIContext()); + ScopedSetContext cp(fg_context ? GetForegroundContext() : GetUIContext()); // This event contains a raw python obj with an incremented ref-count. auto call(Object::New(callable)); diff --git a/src/ballistica/logic/logic.h b/src/ballistica/logic/logic.h index c1d55633..5bf933e6 100644 --- a/src/ballistica/logic/logic.h +++ b/src/ballistica/logic/logic.h @@ -85,7 +85,8 @@ class Logic { // Push a raw Python call, decrements its refcount after running. // Can be pushed from any thread. - auto PushPythonRawCallable(PyObject* callable) -> void; + auto PushPythonRawCallable(PyObject* callable, bool fg_context = false) + -> void; auto PushScreenMessage(const std::string& message, const Vector3f& color) -> void; auto RemovePlayer(Player* player) -> void; diff --git a/src/ballistica/networking/network_reader.cc b/src/ballistica/networking/network_reader.cc index 837dc644..68097bf2 100644 --- a/src/ballistica/networking/network_reader.cc +++ b/src/ballistica/networking/network_reader.cc @@ -128,7 +128,7 @@ static auto HandleGameQuery(const char* buffer, size_t size, memcpy(&query_id, buffer + 1, 4); // Ship them a response packet containing the query id, - // our protocol version, our unique-session-id, and our + // our protocol version, our unique-app-instance-id, and our // player_spec. char msg[400]; diff --git a/src/ballistica/platform/platform.cc b/src/ballistica/platform/platform.cc index 0fa607e7..56d0c959 100644 --- a/src/ballistica/platform/platform.cc +++ b/src/ballistica/platform/platform.cc @@ -543,7 +543,7 @@ static void HandleArgs(int argc, char** argv) { // If there's just one arg and it's "--version", return the version. if (argc == 2 && !strcmp(argv[1], "--version")) { - printf("Ballistica %s build %d\n", kAppVersion, kAppBuildNumber); + printf("BallisticaCore %s build %d\n", kAppVersion, kAppBuildNumber); fflush(stdout); exit(0); } diff --git a/src/ballistica/python/methods/python_methods_app.cc b/src/ballistica/python/methods/python_methods_app.cc index 3ed0d566..d2460ea9 100644 --- a/src/ballistica/python/methods/python_methods_app.cc +++ b/src/ballistica/python/methods/python_methods_app.cc @@ -145,6 +145,31 @@ auto PyIsInReplay(PyObject* self, PyObject* args, PyObject* keywds) BA_PYTHON_CATCH; } +auto PyAppInstanceUUID(PyObject* self, PyObject* args, PyObject* keywds) + -> PyObject* { + BA_PYTHON_TRY; + static const char* kwlist[] = {nullptr}; + if (!PyArg_ParseTupleAndKeywords(args, keywds, "", + const_cast(kwlist))) { + return nullptr; + } + return PyUnicode_FromString(GetAppInstanceUUID().c_str()); + BA_PYTHON_CATCH; +} + +auto PyUserRanCommands(PyObject* self, PyObject* args, PyObject* keywds) + -> PyObject* { + BA_PYTHON_TRY; + static const char* kwlist[] = {nullptr}; + if (!PyArg_ParseTupleAndKeywords(args, keywds, "", + const_cast(kwlist))) { + return nullptr; + } + g_app->user_ran_commands = true; + Py_RETURN_NONE; + BA_PYTHON_CATCH; +} + auto PyRegisterSession(PyObject* self, PyObject* args, PyObject* keywds) -> PyObject* { BA_PYTHON_TRY; @@ -282,11 +307,14 @@ auto PyPushCall(PyObject* self, PyObject* args, PyObject* keywds) -> PyObject* { PyObject* call_obj; int from_other_thread{}; int suppress_warning{}; + int other_thread_use_fg_context{}; static const char* kwlist[] = {"call", "from_other_thread", - "suppress_other_thread_warning", nullptr}; - if (!PyArg_ParseTupleAndKeywords(args, keywds, "O|ip", + "suppress_other_thread_warning", + "other_thread_use_fg_context", nullptr}; + if (!PyArg_ParseTupleAndKeywords(args, keywds, "O|ppp", const_cast(kwlist), &call_obj, - &from_other_thread, &suppress_warning)) { + &from_other_thread, &suppress_warning, + &other_thread_use_fg_context)) { return nullptr; } @@ -303,7 +331,7 @@ auto PyPushCall(PyObject* self, PyObject* args, PyObject* keywds) -> PyObject* { // just increment the python object's refcount and pass it along raw; // the logic thread decrements it on the other end. Py_INCREF(call_obj); - g_logic->PushPythonRawCallable(call_obj); + g_logic->PushPythonRawCallable(call_obj, other_thread_use_fg_context); } else { if (!InLogicThread()) { throw Exception("You must use from_other_thread mode."); @@ -1103,7 +1131,8 @@ auto PythonMethodsApp::GetMethods() -> std::vector { {"pushcall", (PyCFunction)PyPushCall, METH_VARARGS | METH_KEYWORDS, "pushcall(call: Callable, from_other_thread: bool = False,\n" - " suppress_other_thread_warning: bool = False ) -> None\n" + " suppress_other_thread_warning: bool = False,\n" + " other_thread_use_fg_context: bool = False) -> None\n" "\n" "Pushes a call onto the event loop to be run during the next cycle.\n" "\n" @@ -1118,7 +1147,9 @@ auto PythonMethodsApp::GetMethods() -> std::vector { "\n" "If you want to push a call from outside of the logic thread,\n" "however, you can pass 'from_other_thread' as True. In this case\n" - "the call will always run in the UI context on the logic thread."}, + "the call will always run in the UI context on the logic thread\n" + "or whichever context is in the foreground if\n" + "other_thread_use_fg_context is True."}, {"getactivity", (PyCFunction)PyGetActivity, METH_VARARGS | METH_KEYWORDS, @@ -1175,6 +1206,18 @@ auto PythonMethodsApp::GetMethods() -> std::vector { "\n" "(internal)"}, + {"app_instance_uuid", (PyCFunction)PyAppInstanceUUID, + METH_VARARGS | METH_KEYWORDS, + "app_instance_uuid() -> str\n" + "\n" + "(internal)"}, + + {"user_ran_commands", (PyCFunction)PyUserRanCommands, + METH_VARARGS | METH_KEYWORDS, + "user_ran_commands() -> None\n" + "\n" + "(internal)"}, + {"new_replay_session", (PyCFunction)PyNewReplaySession, METH_VARARGS | METH_KEYWORDS, "new_replay_session(file_name: str) -> None\n"