From 121a8c5ae6dc3956cfc5b09899b5b22840c7e86e Mon Sep 17 00:00:00 2001 From: Eric Date: Wed, 31 Jul 2024 16:08:35 -0700 Subject: [PATCH] lang testing works again --- .efrocachemap | 158 +++++++++++------- CHANGELOG.md | 15 +- config/requirements.txt | 3 +- src/assets/.asset_manifest_private.json | 68 ++++++++ src/assets/Makefile | 68 ++++++++ src/assets/ba_data/python/babase/_language.py | 123 ++++++++++---- src/assets/ba_data/python/babase/_net.py | 50 ++---- src/assets/ba_data/python/baclassic/_net.py | 12 +- src/assets/ba_data/python/baenv.py | 2 +- src/ballistica/shared/ballistica.cc | 2 +- tools/bacommon/login.py | 12 ++ 11 files changed, 363 insertions(+), 150 deletions(-) diff --git a/.efrocachemap b/.efrocachemap index 4e2806bc..4eb7efcb 100644 --- a/.efrocachemap +++ b/.efrocachemap @@ -421,43 +421,43 @@ "build/assets/ba_data/audio/zoeOw.ogg": "74befe45a8417e95b6a2233c51992a26", "build/assets/ba_data/audio/zoePickup01.ogg": "48ab8cddfcde36a750856f3f81dd20c8", "build/assets/ba_data/audio/zoeScream01.ogg": "2b468aedfa8741090247f04eb9e6df55", - "build/assets/ba_data/data/langdata.json": "a49e8187178effbd077426d31f7d92ff", + "build/assets/ba_data/data/langdata.json": "99ad02cbe90ab3e46168ddf277633c68", "build/assets/ba_data/data/languages/arabic.json": "dcb913b3d89fe665adbf35e697d2e5d0", "build/assets/ba_data/data/languages/belarussian.json": "3d5523d0004293aa2df02f3f6f3b84f8", - "build/assets/ba_data/data/languages/chinese.json": "2c0105deead2412543323564bbbca749", + "build/assets/ba_data/data/languages/chinese.json": "d4a89bf007a0624c6852c512d1d38cdc", "build/assets/ba_data/data/languages/chinesetraditional.json": "319565f8a15667488f48dbce59278e39", - "build/assets/ba_data/data/languages/croatian.json": "e671b9d0c012be1a30f9c15eb1b81860", - "build/assets/ba_data/data/languages/czech.json": "74219f9b06ff098387b40f85a5b0124e", + "build/assets/ba_data/data/languages/croatian.json": "b23619cb396ac16640c47458f884b16a", + "build/assets/ba_data/data/languages/czech.json": "61bcfce75c0d53d2f2af709cee42187a", "build/assets/ba_data/data/languages/danish.json": "8e57db30c5250df2abff14a822f83ea7", "build/assets/ba_data/data/languages/dutch.json": "b0900d572c9141897d53d6574c471343", - "build/assets/ba_data/data/languages/english.json": "b88cb9e8035e238ccf327d62bde1d190", + "build/assets/ba_data/data/languages/english.json": "eae3a17af2efc2388f96c1e05c024455", "build/assets/ba_data/data/languages/esperanto.json": "0e397cfa5f3fb8cef5f4a64f21cda880", - "build/assets/ba_data/data/languages/filipino.json": "f8d101b436fcf8f92f20a9983fb9fdee", + "build/assets/ba_data/data/languages/filipino.json": "fabaedeefc28cf02ec365ef37046ec0b", "build/assets/ba_data/data/languages/french.json": "b7d11199756f0eb4f1a745ceee652b2a", "build/assets/ba_data/data/languages/german.json": "198b9860c5b9df7b8e3e30b03d8755cb", - "build/assets/ba_data/data/languages/gibberish.json": "becbb2e96a0d85661c1af9ebbf6bb2fb", + "build/assets/ba_data/data/languages/gibberish.json": "085f438ccdb7553bbb7cf5d68e9cd300", "build/assets/ba_data/data/languages/greek.json": "ad3c0d38f34d809824892d6f22808dbf", - "build/assets/ba_data/data/languages/hindi.json": "e56f0ffb57321660aa415e97c2dacfc2", - "build/assets/ba_data/data/languages/hungarian.json": "6b08fea24b72cc805ed0dc59e11c4cd6", + "build/assets/ba_data/data/languages/hindi.json": "54cd56bade6922b40989a8ac5e0c17f6", + "build/assets/ba_data/data/languages/hungarian.json": "0cf994bf9fedf004c9a1011bee179a07", "build/assets/ba_data/data/languages/indonesian.json": "ed9038bf4b9216f93eb73e753e162706", "build/assets/ba_data/data/languages/italian.json": "017f2b20584838d9f5ad88822a4caf62", "build/assets/ba_data/data/languages/korean.json": "4e3524327a0174250aff5e1ef4c0c597", "build/assets/ba_data/data/languages/malay.json": "f6ce0426d03a62612e3e436ed5d1be1f", - "build/assets/ba_data/data/languages/persian.json": "8e3a88cbb729570ffc8e0b06b3337a8f", - "build/assets/ba_data/data/languages/polish.json": "6585f57b1a389b8331b06f610bd8cc6f", - "build/assets/ba_data/data/languages/portuguese.json": "615a59bd03f84659158d9f2608a4ab21", + "build/assets/ba_data/data/languages/persian.json": "87f9dfc085f0ff715b17a8082fc79483", + "build/assets/ba_data/data/languages/polish.json": "3ce5635118b34ea89d6e0f83c8c7e9df", + "build/assets/ba_data/data/languages/portuguese.json": "0accd9462f0acbc5f869f33a2a7a24cd", "build/assets/ba_data/data/languages/romanian.json": "ef68520f749cf3641d4e4225a6166349", - "build/assets/ba_data/data/languages/russian.json": "64f0b7347af86f8c4bec8ba8e781378d", + "build/assets/ba_data/data/languages/russian.json": "e7b90ce1eee8247e164ed7d1470f76bd", "build/assets/ba_data/data/languages/serbian.json": "d7452dd72ac0e51680cb39b5ebaa1c69", "build/assets/ba_data/data/languages/slovak.json": "3c08c748c96c71bd9e1d7291fb8817b6", "build/assets/ba_data/data/languages/spanish.json": "63f80b2c37a1d8092304db1a10ecf789", "build/assets/ba_data/data/languages/swedish.json": "5142a96597d17d8344be96a603da64ac", "build/assets/ba_data/data/languages/tamil.json": "b9fcc523639f55e05c7f4e7914f3321a", "build/assets/ba_data/data/languages/thai.json": "1d665629361f302693dead39de8fa945", - "build/assets/ba_data/data/languages/turkish.json": "babd1ea2ac160cc9253e836c41674fff", - "build/assets/ba_data/data/languages/ukrainian.json": "3f9ee9567a068b760bbf25433177db89", + "build/assets/ba_data/data/languages/turkish.json": "60691e93b58e1612901e8558b967697b", + "build/assets/ba_data/data/languages/ukrainian.json": "6207f0e4048f9391526321d879a5d61e", "build/assets/ba_data/data/languages/venetian.json": "9bb01eea11d1627c0ceb876d26d86d0c", - "build/assets/ba_data/data/languages/vietnamese.json": "0b3bcd0be6d0a138316ad1a1d2553962", + "build/assets/ba_data/data/languages/vietnamese.json": "4bc1ba96ef291fed6d6409ad8cf7357f", "build/assets/ba_data/data/maps/big_g.json": "1dd301d490643088a435ce75df971054", "build/assets/ba_data/data/maps/bridgit.json": "6aea74805f4880cc11237c5734a24422", "build/assets/ba_data/data/maps/courtyard.json": "4b836554c8949bcd2ae382f5e3c1a9cc", @@ -945,11 +945,45 @@ "build/assets/ba_data/meshes/zoeTorso.bob": "26a1007e98902178d8c62fd7069d5da5", "build/assets/ba_data/meshes/zoeUpperArm.bob": "a8a881010ac1ee9ec5ca872d5c5e853a", "build/assets/ba_data/meshes/zoeUpperLeg.bob": "95b2502f74c70f934927f67cd505c3ad", - "build/assets/ba_data/python-site-packages/certifi/__init__.py": "c935c5aee4052f1c76954ace35723dfe", + "build/assets/ba_data/python-site-packages/certifi/__init__.py": "8133ab2f7828219b186d4cecb2d5443b", "build/assets/ba_data/python-site-packages/certifi/__main__.py": "ef02e73f8581609df189a9f61aca365b", - "build/assets/ba_data/python-site-packages/certifi/cacert.pem": "47f35c87a8abc6ace093db7c215f1eab", + "build/assets/ba_data/python-site-packages/certifi/cacert.pem": "072b2f0da8254144432a91d068fa6fb1", "build/assets/ba_data/python-site-packages/certifi/core.py": "c1b8c102093ea26587619677c7ec6016", "build/assets/ba_data/python-site-packages/typing_extensions.py": "1f6b4db70adb7ca05dff2b74f6cde8aa", + "build/assets/ba_data/python-site-packages/urllib3/__init__.py": "06cffcf88c8024218069f628c9938c50", + "build/assets/ba_data/python-site-packages/urllib3/_base_connection.py": "4404e529dbd3db128d9a2e60c6ed9243", + "build/assets/ba_data/python-site-packages/urllib3/_collections.py": "14963d7d43c0e51e777851c0e2868928", + "build/assets/ba_data/python-site-packages/urllib3/_request_methods.py": "87d6a7a77db1324e81d02f919c134f1a", + "build/assets/ba_data/python-site-packages/urllib3/_version.py": "46e3fbaaf7d02c2e55fcecc98deb5af8", + "build/assets/ba_data/python-site-packages/urllib3/connection.py": "3b49efceb61dfab0587286686e0e5ada", + "build/assets/ba_data/python-site-packages/urllib3/connectionpool.py": "e891fe6cdff0c03a3b670e225c0c4d88", + "build/assets/ba_data/python-site-packages/urllib3/contrib/__init__.py": "340c83beff7dcff8f5c7b87cd43cedaf", + "build/assets/ba_data/python-site-packages/urllib3/contrib/emscripten/__init__.py": "33531b60d1ff8b9073567240f2a1745f", + "build/assets/ba_data/python-site-packages/urllib3/contrib/emscripten/connection.py": "e9474e964b3feb3a523ccfab2b4b8f70", + "build/assets/ba_data/python-site-packages/urllib3/contrib/emscripten/fetch.py": "be8618e1c9a004108bf9f82f706503d7", + "build/assets/ba_data/python-site-packages/urllib3/contrib/emscripten/request.py": "da01c66ef924f2a2875d46adb87d7507", + "build/assets/ba_data/python-site-packages/urllib3/contrib/emscripten/response.py": "11208e765d5e9a1d481ded597e58c7d3", + "build/assets/ba_data/python-site-packages/urllib3/contrib/pyopenssl.py": "7a14ef1c58c55511581043ed25aebba3", + "build/assets/ba_data/python-site-packages/urllib3/contrib/socks.py": "bd5fed33c678f750ad9d1c754a26faf0", + "build/assets/ba_data/python-site-packages/urllib3/exceptions.py": "c346a13d762dcdff2f9cccc1d06c92d6", + "build/assets/ba_data/python-site-packages/urllib3/fields.py": "e24ef9e64962ca25322c0216cc4bc923", + "build/assets/ba_data/python-site-packages/urllib3/filepost.py": "d0a96fd7614fcaa368b26d8a769ff848", + "build/assets/ba_data/python-site-packages/urllib3/http2.py": "c307bd4c486d10070770c320145eb33c", + "build/assets/ba_data/python-site-packages/urllib3/poolmanager.py": "6dd72a45419efb9a2ab4e58c527d84d5", + "build/assets/ba_data/python-site-packages/urllib3/response.py": "f9f74417b5c2b4e5812b473435e3f455", + "build/assets/ba_data/python-site-packages/urllib3/util/__init__.py": "3ef2c56aa3ccfc25f466dc767f191b2c", + "build/assets/ba_data/python-site-packages/urllib3/util/connection.py": "888aa8c2f0a4a76749e6c3fd0df597e2", + "build/assets/ba_data/python-site-packages/urllib3/util/proxy.py": "2de685261596886eb8e2655e1af9ce7b", + "build/assets/ba_data/python-site-packages/urllib3/util/request.py": "a1fb665c16fa443eef15db73c5e29917", + "build/assets/ba_data/python-site-packages/urllib3/util/response.py": "e6a942417aa97215e358ae97b53bafe6", + "build/assets/ba_data/python-site-packages/urllib3/util/retry.py": "4eeffe54c7d400c4af731f02ef3fb074", + "build/assets/ba_data/python-site-packages/urllib3/util/ssl_.py": "c1b929bdfba831479f4b2d1538954536", + "build/assets/ba_data/python-site-packages/urllib3/util/ssl_match_hostname.py": "cbb28520c901282629d47375af2dd717", + "build/assets/ba_data/python-site-packages/urllib3/util/ssltransport.py": "0a51cd95ce75673b6c1117cb22da18b1", + "build/assets/ba_data/python-site-packages/urllib3/util/timeout.py": "e3bc037067fd6aaed823955be6f1792d", + "build/assets/ba_data/python-site-packages/urllib3/util/url.py": "6a37bafe6598aecba9e034be2085f583", + "build/assets/ba_data/python-site-packages/urllib3/util/util.py": "95e6d2fa1b0f310a991612421f1a29a1", + "build/assets/ba_data/python-site-packages/urllib3/util/wait.py": "0fe73d2b5515a9c1ff2d43a83d5a419a", "build/assets/ba_data/textures/achievementBoxer.dds": "5b5c461e67f3a92105b56fe264a7dd28", "build/assets/ba_data/textures/achievementBoxer.ktx": "1055e009423ea1d0bc3b172f9d7328bb", "build/assets/ba_data/textures/achievementBoxer.pvr": "48f212189a6d83d29be410613b4f0005", @@ -4062,50 +4096,50 @@ "build/assets/windows/Win32/ucrtbased.dll": "2def5335207d41b21b9823f6805997f1", "build/assets/windows/Win32/vc_redist.x86.exe": "b08a55e2e77623fe657bea24f223a3ae", "build/assets/windows/Win32/vcruntime140d.dll": "865b2af4d1e26a1a8073c89acb06e599", - "build/prefab/full/linux_arm64_gui/debug/ballisticakit": "221f834ebd057ef663585d6ceef6806d", - "build/prefab/full/linux_arm64_gui/release/ballisticakit": "a2d8de14f13d4c3685fcaa317a7b27dc", - "build/prefab/full/linux_arm64_server/debug/dist/ballisticakit_headless": "39882077657944b36cf5491d43689329", - "build/prefab/full/linux_arm64_server/release/dist/ballisticakit_headless": "7b0fd21a0cba86a1edfc41fa7f5b0336", - "build/prefab/full/linux_x86_64_gui/debug/ballisticakit": "e652b60f054852cf0dd7efcafea4998d", - "build/prefab/full/linux_x86_64_gui/release/ballisticakit": "5deab4167830ac91daac9146c3768e04", - "build/prefab/full/linux_x86_64_server/debug/dist/ballisticakit_headless": "53171f039acbcb69a64983bc78cc3af9", - "build/prefab/full/linux_x86_64_server/release/dist/ballisticakit_headless": "bc906b8824309daab45cfdd64f4f75cc", - "build/prefab/full/mac_arm64_gui/debug/ballisticakit": "c9d66aa3f870b4820ccb00ad87edd30e", - "build/prefab/full/mac_arm64_gui/release/ballisticakit": "d99eeb561df547c8228110d66a90fbee", - "build/prefab/full/mac_arm64_server/debug/dist/ballisticakit_headless": "663c7ebd76302a57eeef8574f2244a70", - "build/prefab/full/mac_arm64_server/release/dist/ballisticakit_headless": "e73ac0a48a7921d5407cbabaa005a03a", - "build/prefab/full/mac_x86_64_gui/debug/ballisticakit": "bf05c75c4991e13b9246d7638b6a276a", - "build/prefab/full/mac_x86_64_gui/release/ballisticakit": "0edc9540a699d9b7af0916e0d8b286b3", - "build/prefab/full/mac_x86_64_server/debug/dist/ballisticakit_headless": "15e24928603d9b31bfdabdcb1129535c", - "build/prefab/full/mac_x86_64_server/release/dist/ballisticakit_headless": "a15e467a1d7a9a080952ee02194a85f9", - "build/prefab/full/windows_x86_gui/debug/BallisticaKit.exe": "f09896f99981cd6af58257e4bfbffa73", - "build/prefab/full/windows_x86_gui/release/BallisticaKit.exe": "deb4cdf43592b785f417d9e3992803ad", - "build/prefab/full/windows_x86_server/debug/dist/BallisticaKitHeadless.exe": "a46ba814582aef26306eb0811cd22d3f", - "build/prefab/full/windows_x86_server/release/dist/BallisticaKitHeadless.exe": "2352638cf37627c0cf9d11f8686194b7", - "build/prefab/lib/linux_arm64_gui/debug/libballisticaplus.a": "ffe8631c0ccc03751b4346fcf52d70ca", - "build/prefab/lib/linux_arm64_gui/release/libballisticaplus.a": "4241e93e1ea18414ee900046d1a62517", - "build/prefab/lib/linux_arm64_server/debug/libballisticaplus.a": "ffe8631c0ccc03751b4346fcf52d70ca", - "build/prefab/lib/linux_arm64_server/release/libballisticaplus.a": "4241e93e1ea18414ee900046d1a62517", - "build/prefab/lib/linux_x86_64_gui/debug/libballisticaplus.a": "cd90771128eda8880ac3f9d8d9fc530b", - "build/prefab/lib/linux_x86_64_gui/release/libballisticaplus.a": "093ec692aa3c6039ccc322d74f2d4448", - "build/prefab/lib/linux_x86_64_server/debug/libballisticaplus.a": "cd90771128eda8880ac3f9d8d9fc530b", - "build/prefab/lib/linux_x86_64_server/release/libballisticaplus.a": "093ec692aa3c6039ccc322d74f2d4448", - "build/prefab/lib/mac_arm64_gui/debug/libballisticaplus.a": "40f3006295c57114c2b5c467f463dd79", - "build/prefab/lib/mac_arm64_gui/release/libballisticaplus.a": "9049a93c01002bea0e6a580a106939c3", - "build/prefab/lib/mac_arm64_server/debug/libballisticaplus.a": "40f3006295c57114c2b5c467f463dd79", - "build/prefab/lib/mac_arm64_server/release/libballisticaplus.a": "9049a93c01002bea0e6a580a106939c3", - "build/prefab/lib/mac_x86_64_gui/debug/libballisticaplus.a": "07ee17e424c0ea754fd4ec9844063460", - "build/prefab/lib/mac_x86_64_gui/release/libballisticaplus.a": "0f34f852bf368c787f41533230767b3a", - "build/prefab/lib/mac_x86_64_server/debug/libballisticaplus.a": "1dcd03f0cfc75a53c3e682a3a46c96a0", - "build/prefab/lib/mac_x86_64_server/release/libballisticaplus.a": "0f34f852bf368c787f41533230767b3a", - "build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.lib": "67f48c2af7ec20dc98e6423d3ff24d67", - "build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.pdb": "0b0319aa1bbf146e14fe8103abb23bd3", - "build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.lib": "9102b512eaf6bcf21d1dbcb9c597dbe4", - "build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.pdb": "5dbc7599675f5cae378fcc24b8908e20", - "build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.lib": "eab27e872b8c3950b6bf9044fa3a42a2", - "build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.pdb": "d9b13c6efc258a4dabf158df63673b22", - "build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.lib": "27050ecb092d111cf013a561cfbb8c05", - "build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.pdb": "a4d3c5812734e5780859e21c7398844a", + "build/prefab/full/linux_arm64_gui/debug/ballisticakit": "f3045ecce09d6b02aa1143a63379f376", + "build/prefab/full/linux_arm64_gui/release/ballisticakit": "b2b23e2c86a0d8855047d39e4ce100f2", + "build/prefab/full/linux_arm64_server/debug/dist/ballisticakit_headless": "b0f07ceab1293255ba793bfcd8d9ce68", + "build/prefab/full/linux_arm64_server/release/dist/ballisticakit_headless": "bf6c4be5753337a3a0ed32eac9081a41", + "build/prefab/full/linux_x86_64_gui/debug/ballisticakit": "a2b3ed524a6355287303b5775ff11334", + "build/prefab/full/linux_x86_64_gui/release/ballisticakit": "4b90056bfa99a1816a56f9b53de33832", + "build/prefab/full/linux_x86_64_server/debug/dist/ballisticakit_headless": "ca006356e178979499ce55f53c273218", + "build/prefab/full/linux_x86_64_server/release/dist/ballisticakit_headless": "dcf0f076fd0ea67540f43b4bd41e3060", + "build/prefab/full/mac_arm64_gui/debug/ballisticakit": "b9cf3cacf64f9539c97ccdd08c6d9211", + "build/prefab/full/mac_arm64_gui/release/ballisticakit": "698c12289c1906613169297872b1e552", + "build/prefab/full/mac_arm64_server/debug/dist/ballisticakit_headless": "6ff0e52c7467d0f62bbee293fbb0ac65", + "build/prefab/full/mac_arm64_server/release/dist/ballisticakit_headless": "c1bf97907381bd2e82d3c0290dfcbda1", + "build/prefab/full/mac_x86_64_gui/debug/ballisticakit": "e0874cef443a76f7fc7b33ab7801838a", + "build/prefab/full/mac_x86_64_gui/release/ballisticakit": "c4542ae04345c472aeef9fa411cad2c1", + "build/prefab/full/mac_x86_64_server/debug/dist/ballisticakit_headless": "d6bf17052772c041dda3a7d0048f5804", + "build/prefab/full/mac_x86_64_server/release/dist/ballisticakit_headless": "e0018525599f2e5b0ce9d3091799b6da", + "build/prefab/full/windows_x86_gui/debug/BallisticaKit.exe": "175db7f5d22fe1d8f1c80fef4f7679e9", + "build/prefab/full/windows_x86_gui/release/BallisticaKit.exe": "d1817c7e638914e0362d598527fd0a04", + "build/prefab/full/windows_x86_server/debug/dist/BallisticaKitHeadless.exe": "2779fdf6b5968e55a2c056427dbce007", + "build/prefab/full/windows_x86_server/release/dist/BallisticaKitHeadless.exe": "952860758eb4ccc9422b911a69ad9f7b", + "build/prefab/lib/linux_arm64_gui/debug/libballisticaplus.a": "273ffd46a618fe347a570e6bd01d54a4", + "build/prefab/lib/linux_arm64_gui/release/libballisticaplus.a": "fa659b5d6119acba6570c92ce4d35ae2", + "build/prefab/lib/linux_arm64_server/debug/libballisticaplus.a": "273ffd46a618fe347a570e6bd01d54a4", + "build/prefab/lib/linux_arm64_server/release/libballisticaplus.a": "fa659b5d6119acba6570c92ce4d35ae2", + "build/prefab/lib/linux_x86_64_gui/debug/libballisticaplus.a": "712db7e1fcd065a3a22faddc0def8670", + "build/prefab/lib/linux_x86_64_gui/release/libballisticaplus.a": "4a4c19120f810ff5b4c7afbf11c23cf6", + "build/prefab/lib/linux_x86_64_server/debug/libballisticaplus.a": "712db7e1fcd065a3a22faddc0def8670", + "build/prefab/lib/linux_x86_64_server/release/libballisticaplus.a": "4a4c19120f810ff5b4c7afbf11c23cf6", + "build/prefab/lib/mac_arm64_gui/debug/libballisticaplus.a": "bbee8acd115ca24fc14146a9fc47c676", + "build/prefab/lib/mac_arm64_gui/release/libballisticaplus.a": "8b68b56dda9a9f421823e653b752445a", + "build/prefab/lib/mac_arm64_server/debug/libballisticaplus.a": "bbee8acd115ca24fc14146a9fc47c676", + "build/prefab/lib/mac_arm64_server/release/libballisticaplus.a": "8b68b56dda9a9f421823e653b752445a", + "build/prefab/lib/mac_x86_64_gui/debug/libballisticaplus.a": "3108eb4d3a41bde33702e22fb893b218", + "build/prefab/lib/mac_x86_64_gui/release/libballisticaplus.a": "3e5c5fd0a09f55ba7b05ce1e2ec7171e", + "build/prefab/lib/mac_x86_64_server/debug/libballisticaplus.a": "1659535e95e3047fda529543e265ac97", + "build/prefab/lib/mac_x86_64_server/release/libballisticaplus.a": "3e5c5fd0a09f55ba7b05ce1e2ec7171e", + "build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.lib": "7d60528bda9b3e6abc046462da6e3e96", + "build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.pdb": "bbbb1509630e43ed6d9f15a003369427", + "build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.lib": "4f0d8de7fcc754e2443a1b52b476e5f7", + "build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.pdb": "448b0ef8b5b27a87f5993e9f75e93efa", + "build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.lib": "130605828f3d97c90e195cccce392d4d", + "build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.pdb": "d548df51f78261788404040a1a2921b9", + "build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.lib": "96fc6408bd113f219a2289c1f2829a8a", + "build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.pdb": "c57f7d3676b8c4abe9ee887dbbb0cc21", "src/assets/ba_data/python/babase/_mgen/__init__.py": "f885fed7f2ed98ff2ba271f9dbe3391c", "src/assets/ba_data/python/babase/_mgen/enums.py": "cb299985623bbcc86015cb103a424ae6", "src/ballistica/base/mgen/pyembed/binding_base.inc": "efa61468cf098f77cc6a234461d8b86d", diff --git a/CHANGELOG.md b/CHANGELOG.md index a597a279..c0829a2d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,16 @@ -### 1.7.37 (build 21945, api 8, 2024-07-27) - +### 1.7.37 (build 21947, api 8, 2024-07-31) +- Finally got things updated so language testing works again, and made it a bit + spiffier while at it. You now simply point the game at your test language and + it will update dynamically as you make edits; no need to download any files. + Example: if you are editing PirateSpeak, you should see an id such as + 'PirateSpeak_2248' in the website url. You can then go to the game and run + `import babase; babase.app.lang.testlanguage('PirateSpeak_2248')` and you + should instantly see some lovely pirate-speak. Also, any changes you make on + the website should show up in the game within a few seconds. Enjoy! +- Added `urllib3` to our bundled third party Python modules. The engine will be + doing more heavy downloading with Asset Packages coming online so its time to + upgrade to a more modern web client library than Python's basic built in + urllib stuff. ### 1.7.36 (build 21944, api 8, 2024-07-26) - Wired up Tokens, BombSquad's new purchasable currency. The first thing these can be used for is storage packs on ballistica.net, but this will expand to diff --git a/config/requirements.txt b/config/requirements.txt index 9ba3cea3..229ecbd0 100644 --- a/config/requirements.txt +++ b/config/requirements.txt @@ -2,7 +2,7 @@ cpplint==1.6.1 dmgbuild==1.6.1 filelock==3.15.4 furo==2024.7.18 -mypy==1.11.0 +mypy==1.11.1 pbxproj==4.2.0 pdoc==14.6.0 pur==7.3.2 @@ -19,3 +19,4 @@ types-certifi==2021.10.8.3 types-filelock==3.2.7 types-requests==2.32.0.20240712 typing_extensions==4.12.2 +urllib3==2.2.2 diff --git a/src/assets/.asset_manifest_private.json b/src/assets/.asset_manifest_private.json index e9ecb042..cb9f5cf8 100644 --- a/src/assets/.asset_manifest_private.json +++ b/src/assets/.asset_manifest_private.json @@ -953,6 +953,74 @@ "ba_data/python-site-packages/certifi/cacert.pem", "ba_data/python-site-packages/certifi/core.py", "ba_data/python-site-packages/typing_extensions.py", + "ba_data/python-site-packages/urllib3/__init__.py", + "ba_data/python-site-packages/urllib3/__pycache__/__init__.cpython-312.opt-1.pyc", + "ba_data/python-site-packages/urllib3/__pycache__/_base_connection.cpython-312.opt-1.pyc", + "ba_data/python-site-packages/urllib3/__pycache__/_collections.cpython-312.opt-1.pyc", + "ba_data/python-site-packages/urllib3/__pycache__/_request_methods.cpython-312.opt-1.pyc", + "ba_data/python-site-packages/urllib3/__pycache__/_version.cpython-312.opt-1.pyc", + "ba_data/python-site-packages/urllib3/__pycache__/connection.cpython-312.opt-1.pyc", + "ba_data/python-site-packages/urllib3/__pycache__/connectionpool.cpython-312.opt-1.pyc", + "ba_data/python-site-packages/urllib3/__pycache__/exceptions.cpython-312.opt-1.pyc", + "ba_data/python-site-packages/urllib3/__pycache__/fields.cpython-312.opt-1.pyc", + "ba_data/python-site-packages/urllib3/__pycache__/filepost.cpython-312.opt-1.pyc", + "ba_data/python-site-packages/urllib3/__pycache__/http2.cpython-312.opt-1.pyc", + "ba_data/python-site-packages/urllib3/__pycache__/poolmanager.cpython-312.opt-1.pyc", + "ba_data/python-site-packages/urllib3/__pycache__/response.cpython-312.opt-1.pyc", + "ba_data/python-site-packages/urllib3/_base_connection.py", + "ba_data/python-site-packages/urllib3/_collections.py", + "ba_data/python-site-packages/urllib3/_request_methods.py", + "ba_data/python-site-packages/urllib3/_version.py", + "ba_data/python-site-packages/urllib3/connection.py", + "ba_data/python-site-packages/urllib3/connectionpool.py", + "ba_data/python-site-packages/urllib3/contrib/__init__.py", + "ba_data/python-site-packages/urllib3/contrib/__pycache__/__init__.cpython-312.opt-1.pyc", + "ba_data/python-site-packages/urllib3/contrib/__pycache__/pyopenssl.cpython-312.opt-1.pyc", + "ba_data/python-site-packages/urllib3/contrib/__pycache__/socks.cpython-312.opt-1.pyc", + "ba_data/python-site-packages/urllib3/contrib/emscripten/__init__.py", + "ba_data/python-site-packages/urllib3/contrib/emscripten/__pycache__/__init__.cpython-312.opt-1.pyc", + "ba_data/python-site-packages/urllib3/contrib/emscripten/__pycache__/connection.cpython-312.opt-1.pyc", + "ba_data/python-site-packages/urllib3/contrib/emscripten/__pycache__/fetch.cpython-312.opt-1.pyc", + "ba_data/python-site-packages/urllib3/contrib/emscripten/__pycache__/request.cpython-312.opt-1.pyc", + "ba_data/python-site-packages/urllib3/contrib/emscripten/__pycache__/response.cpython-312.opt-1.pyc", + "ba_data/python-site-packages/urllib3/contrib/emscripten/connection.py", + "ba_data/python-site-packages/urllib3/contrib/emscripten/fetch.py", + "ba_data/python-site-packages/urllib3/contrib/emscripten/request.py", + "ba_data/python-site-packages/urllib3/contrib/emscripten/response.py", + "ba_data/python-site-packages/urllib3/contrib/pyopenssl.py", + "ba_data/python-site-packages/urllib3/contrib/socks.py", + "ba_data/python-site-packages/urllib3/exceptions.py", + "ba_data/python-site-packages/urllib3/fields.py", + "ba_data/python-site-packages/urllib3/filepost.py", + "ba_data/python-site-packages/urllib3/http2.py", + "ba_data/python-site-packages/urllib3/poolmanager.py", + "ba_data/python-site-packages/urllib3/response.py", + "ba_data/python-site-packages/urllib3/util/__init__.py", + "ba_data/python-site-packages/urllib3/util/__pycache__/__init__.cpython-312.opt-1.pyc", + "ba_data/python-site-packages/urllib3/util/__pycache__/connection.cpython-312.opt-1.pyc", + "ba_data/python-site-packages/urllib3/util/__pycache__/proxy.cpython-312.opt-1.pyc", + "ba_data/python-site-packages/urllib3/util/__pycache__/request.cpython-312.opt-1.pyc", + "ba_data/python-site-packages/urllib3/util/__pycache__/response.cpython-312.opt-1.pyc", + "ba_data/python-site-packages/urllib3/util/__pycache__/retry.cpython-312.opt-1.pyc", + "ba_data/python-site-packages/urllib3/util/__pycache__/ssl_.cpython-312.opt-1.pyc", + "ba_data/python-site-packages/urllib3/util/__pycache__/ssl_match_hostname.cpython-312.opt-1.pyc", + "ba_data/python-site-packages/urllib3/util/__pycache__/ssltransport.cpython-312.opt-1.pyc", + "ba_data/python-site-packages/urllib3/util/__pycache__/timeout.cpython-312.opt-1.pyc", + "ba_data/python-site-packages/urllib3/util/__pycache__/url.cpython-312.opt-1.pyc", + "ba_data/python-site-packages/urllib3/util/__pycache__/util.cpython-312.opt-1.pyc", + "ba_data/python-site-packages/urllib3/util/__pycache__/wait.cpython-312.opt-1.pyc", + "ba_data/python-site-packages/urllib3/util/connection.py", + "ba_data/python-site-packages/urllib3/util/proxy.py", + "ba_data/python-site-packages/urllib3/util/request.py", + "ba_data/python-site-packages/urllib3/util/response.py", + "ba_data/python-site-packages/urllib3/util/retry.py", + "ba_data/python-site-packages/urllib3/util/ssl_.py", + "ba_data/python-site-packages/urllib3/util/ssl_match_hostname.py", + "ba_data/python-site-packages/urllib3/util/ssltransport.py", + "ba_data/python-site-packages/urllib3/util/timeout.py", + "ba_data/python-site-packages/urllib3/util/url.py", + "ba_data/python-site-packages/urllib3/util/util.py", + "ba_data/python-site-packages/urllib3/util/wait.py", "ba_data/textures/achievementBoxer.dds", "ba_data/textures/achievementBoxer.ktx", "ba_data/textures/achievementBoxer.pvr", diff --git a/src/assets/Makefile b/src/assets/Makefile index a4a3872f..ec7bbaf9 100644 --- a/src/assets/Makefile +++ b/src/assets/Makefile @@ -2706,6 +2706,40 @@ SCRIPT_TARGETS_PY_PRIVATE_COMMON = \ $(BUILD_DIR)/ba_data/python-site-packages/certifi/__main__.py \ $(BUILD_DIR)/ba_data/python-site-packages/certifi/core.py \ $(BUILD_DIR)/ba_data/python-site-packages/typing_extensions.py \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/__init__.py \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/_base_connection.py \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/_collections.py \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/_request_methods.py \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/_version.py \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/connection.py \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/connectionpool.py \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/contrib/__init__.py \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/contrib/emscripten/__init__.py \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/contrib/emscripten/connection.py \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/contrib/emscripten/fetch.py \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/contrib/emscripten/request.py \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/contrib/emscripten/response.py \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/contrib/pyopenssl.py \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/contrib/socks.py \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/exceptions.py \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/fields.py \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/filepost.py \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/http2.py \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/poolmanager.py \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/response.py \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/util/__init__.py \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/util/connection.py \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/util/proxy.py \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/util/request.py \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/util/response.py \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/util/retry.py \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/util/ssl_.py \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/util/ssl_match_hostname.py \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/util/ssltransport.py \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/util/timeout.py \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/util/url.py \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/util/util.py \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/util/wait.py \ $(BUILD_DIR)/sphinx/static/conf.py SCRIPT_TARGETS_PYC_PRIVATE_COMMON = \ @@ -2713,6 +2747,40 @@ SCRIPT_TARGETS_PYC_PRIVATE_COMMON = \ $(BUILD_DIR)/ba_data/python-site-packages/certifi/__pycache__/__main__.cpython-312.opt-1.pyc \ $(BUILD_DIR)/ba_data/python-site-packages/certifi/__pycache__/core.cpython-312.opt-1.pyc \ $(BUILD_DIR)/ba_data/python-site-packages/__pycache__/typing_extensions.cpython-312.opt-1.pyc \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/__pycache__/__init__.cpython-312.opt-1.pyc \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/__pycache__/_base_connection.cpython-312.opt-1.pyc \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/__pycache__/_collections.cpython-312.opt-1.pyc \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/__pycache__/_request_methods.cpython-312.opt-1.pyc \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/__pycache__/_version.cpython-312.opt-1.pyc \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/__pycache__/connection.cpython-312.opt-1.pyc \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/__pycache__/connectionpool.cpython-312.opt-1.pyc \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/contrib/__pycache__/__init__.cpython-312.opt-1.pyc \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/contrib/emscripten/__pycache__/__init__.cpython-312.opt-1.pyc \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/contrib/emscripten/__pycache__/connection.cpython-312.opt-1.pyc \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/contrib/emscripten/__pycache__/fetch.cpython-312.opt-1.pyc \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/contrib/emscripten/__pycache__/request.cpython-312.opt-1.pyc \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/contrib/emscripten/__pycache__/response.cpython-312.opt-1.pyc \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/contrib/__pycache__/pyopenssl.cpython-312.opt-1.pyc \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/contrib/__pycache__/socks.cpython-312.opt-1.pyc \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/__pycache__/exceptions.cpython-312.opt-1.pyc \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/__pycache__/fields.cpython-312.opt-1.pyc \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/__pycache__/filepost.cpython-312.opt-1.pyc \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/__pycache__/http2.cpython-312.opt-1.pyc \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/__pycache__/poolmanager.cpython-312.opt-1.pyc \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/__pycache__/response.cpython-312.opt-1.pyc \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/util/__pycache__/__init__.cpython-312.opt-1.pyc \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/util/__pycache__/connection.cpython-312.opt-1.pyc \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/util/__pycache__/proxy.cpython-312.opt-1.pyc \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/util/__pycache__/request.cpython-312.opt-1.pyc \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/util/__pycache__/response.cpython-312.opt-1.pyc \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/util/__pycache__/retry.cpython-312.opt-1.pyc \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/util/__pycache__/ssl_.cpython-312.opt-1.pyc \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/util/__pycache__/ssl_match_hostname.cpython-312.opt-1.pyc \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/util/__pycache__/ssltransport.cpython-312.opt-1.pyc \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/util/__pycache__/timeout.cpython-312.opt-1.pyc \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/util/__pycache__/url.cpython-312.opt-1.pyc \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/util/__pycache__/util.cpython-312.opt-1.pyc \ + $(BUILD_DIR)/ba_data/python-site-packages/urllib3/util/__pycache__/wait.cpython-312.opt-1.pyc \ $(BUILD_DIR)/sphinx/static/__pycache__/conf.cpython-312.opt-1.pyc # Rule to copy src asset scripts to dst. diff --git a/src/assets/ba_data/python/babase/_language.py b/src/assets/ba_data/python/babase/_language.py index f36e9ace..4e118b58 100644 --- a/src/assets/ba_data/python/babase/_language.py +++ b/src/assets/ba_data/python/babase/_language.py @@ -6,6 +6,7 @@ from __future__ import annotations import os import json import logging +from functools import partial from typing import TYPE_CHECKING, overload, override import _babase @@ -32,6 +33,7 @@ class LanguageSubsystem(AppSubsystem): self._language: str | None = None self._language_target: AttrDict | None = None self._language_merged: AttrDict | None = None + self._test_timer: babase.AppTimer | None = None @property def locale(self) -> str: @@ -93,9 +95,44 @@ class LanguageSubsystem(AppSubsystem): name for name in names if self._can_display_language(name) ) + def testlanguage(self, langid: str) -> None: + """Set the app to test an in-progress language. + + Pass a language id from the translation editor website as 'langid'; + something like 'Gibberish_3263'. Once set to testing, the engine + will repeatedly download and apply that same test language, so + changes can be made to it and observed live. + """ + print( + f'Language test mode enabled.' + f' Will fetch and apply \'{langid}\' every 5 seconds,' + f' so you can see your changes live.' + ) + self._test_timer = _babase.AppTimer( + 5.0, partial(self._update_test_language, langid), repeat=True + ) + self._update_test_language(langid) + + def _on_test_lang_response( + self, langid: str, response: None | dict[str, Any] + ) -> None: + if response is None: + return + self.setlanguage(response) + print(f'Fetched and applied {langid}.') + + def _update_test_language(self, langid: str) -> None: + if _babase.app.classic is None: + raise RuntimeError('This requires classic.') + _babase.app.classic.master_server_v1_get( + 'bsLangGet', + {'lang': langid, 'format': 'json'}, + partial(self._on_test_lang_response, langid), + ) + def setlanguage( self, - language: str | None, + language: str | dict | None, print_change: bool = True, store_to_config: bool = True, ) -> None: @@ -110,18 +147,6 @@ class LanguageSubsystem(AppSubsystem): cfg = _babase.app.config cur_language = cfg.get('Lang', None) - # Store this in the config if its changing. - if language != cur_language and store_to_config: - if language is None: - if 'Lang' in cfg: - del cfg['Lang'] # Clear it out for default. - else: - cfg['Lang'] = language - cfg.commit() - switched = True - else: - switched = False - with open( os.path.join( _babase.app.env.data_directory, @@ -134,32 +159,55 @@ class LanguageSubsystem(AppSubsystem): ) as infile: lenglishvalues = json.loads(infile.read()) - # None implies default. - if language is None: - language = self.default_language - try: - if language == 'English': - lmodvalues = None - else: - lmodfile = os.path.join( - _babase.app.env.data_directory, - 'ba_data', - 'data', - 'languages', - language.lower() + '.json', - ) - with open(lmodfile, encoding='utf-8') as infile: - lmodvalues = json.loads(infile.read()) - except Exception: - logging.exception("Error importing language '%s'.", language) - _babase.screenmessage( - f"Error setting language to '{language}'; see log for details.", - color=(1, 0, 0), - ) + # Special case - passing a complete dict for testing. + if isinstance(language, dict): + self._language = 'Custom' + lmodvalues = language switched = False - lmodvalues = None + print_change = False + store_to_config = False + else: + # Ok, we're setting a real language. - self._language = language + # Store this in the config if its changing. + if language != cur_language and store_to_config: + if language is None: + if 'Lang' in cfg: + del cfg['Lang'] # Clear it out for default. + else: + cfg['Lang'] = language + cfg.commit() + switched = True + else: + switched = False + + # None implies default. + if language is None: + language = self.default_language + try: + if language == 'English': + lmodvalues = None + else: + lmodfile = os.path.join( + _babase.app.env.data_directory, + 'ba_data', + 'data', + 'languages', + language.lower() + '.json', + ) + with open(lmodfile, encoding='utf-8') as infile: + lmodvalues = json.loads(infile.read()) + except Exception: + logging.exception("Error importing language '%s'.", language) + _babase.screenmessage( + f"Error setting language to '{language}';" + f' see log for details.', + color=(1, 0, 0), + ) + switched = False + lmodvalues = None + + self._language = language # Create an attrdict of *just* our target language. self._language_target = AttrDict() @@ -207,6 +255,7 @@ class LanguageSubsystem(AppSubsystem): random_names = [n for n in random_names if n != ''] _babase.set_internal_language_keys(internal_vals, random_names) if switched and print_change: + assert isinstance(language, str) _babase.screenmessage( Lstr( resource='languageSetText', diff --git a/src/assets/ba_data/python/babase/_net.py b/src/assets/ba_data/python/babase/_net.py index 226fcb9e..93522adf 100644 --- a/src/assets/ba_data/python/babase/_net.py +++ b/src/assets/ba_data/python/babase/_net.py @@ -4,11 +4,13 @@ from __future__ import annotations import ssl +import socket import threading +import ipaddress from typing import TYPE_CHECKING if TYPE_CHECKING: - import socket + pass # Timeout for standard functions talking to the master-server/etc. DEFAULT_REQUEST_TIMEOUT_SECONDS = 60 @@ -18,6 +20,10 @@ class NetworkSubsystem: """Network related app subsystem.""" def __init__(self) -> None: + # Our shared SSL context. Creating these can be expensive so we + # create it here once and recycle for our various connections. + self.sslcontext = ssl.create_default_context() + # Anyone accessing/modifying zone_pings should hold this lock, # as it is updated by a background thread. self.zone_pings_lock = threading.Lock() @@ -27,8 +33,6 @@ class NetworkSubsystem: # that a nearby server has been pinged. self.zone_pings: dict[str, float] = {} - self._sslcontext: ssl.SSLContext | None = None - # For debugging. self.v1_test_log: str = '' self.v1_ctest_results: dict[int, str] = {} @@ -36,42 +40,12 @@ class NetworkSubsystem: self.transport_state = 'uninited' self.server_time_offset_hours: float | None = None - @property - def sslcontext(self) -> ssl.SSLContext: - """Create/return our shared SSLContext. - - This can be reused for all standard urllib requests/etc. - """ - # Note: I've run into older Android devices taking upwards of 1 second - # to put together a default SSLContext, so recycling one can definitely - # be a worthwhile optimization. This was suggested to me in this - # thread by one of Python's SSL maintainers: - # https://github.com/python/cpython/issues/94637 - if self._sslcontext is None: - self._sslcontext = ssl.create_default_context() - return self._sslcontext - def get_ip_address_type(addr: str) -> socket.AddressFamily: """Return socket.AF_INET6 or socket.AF_INET4 for the provided address.""" - import socket - socket_type = None - - # First try it as an ipv4 address. - try: - socket.inet_pton(socket.AF_INET, addr) - socket_type = socket.AF_INET - except OSError: - pass - - # Hmm apparently not ipv4; try ipv6. - if socket_type is None: - try: - socket.inet_pton(socket.AF_INET6, addr) - socket_type = socket.AF_INET6 - except OSError: - pass - if socket_type is None: - raise ValueError(f'addr seems to be neither v4 or v6: {addr}') - return socket_type + version = ipaddress.ip_address(addr).version + if version == 4: + return socket.AF_INET + assert version == 6 + return socket.AF_INET6 diff --git a/src/assets/ba_data/python/baclassic/_net.py b/src/assets/ba_data/python/baclassic/_net.py index 98fbc9a8..359c4425 100644 --- a/src/assets/ba_data/python/baclassic/_net.py +++ b/src/assets/ba_data/python/baclassic/_net.py @@ -96,13 +96,9 @@ class MasterServerV1CallThread(threading.Thread): self._data = babase.utf8_all(self._data) babase.set_thread_name('BA_ServerCallThread') if self._request_type == 'get': - url = ( - plus.get_master_server_address() - + '/' - + self._request - + '?' - + urllib.parse.urlencode(self._data) - ) + msaddr = plus.get_master_server_address() + dataenc = urllib.parse.urlencode(self._data) + url = f'{msaddr}/{self._request}?{dataenc}' assert url is not None response = urllib.request.urlopen( urllib.request.Request( @@ -114,7 +110,7 @@ class MasterServerV1CallThread(threading.Thread): timeout=babase.DEFAULT_REQUEST_TIMEOUT_SECONDS, ) elif self._request_type == 'post': - url = plus.get_master_server_address() + '/' + self._request + url = f'{plus.get_master_server_address()}/{self._request}' assert url is not None response = urllib.request.urlopen( urllib.request.Request( diff --git a/src/assets/ba_data/python/baenv.py b/src/assets/ba_data/python/baenv.py index 18086894..ab249405 100644 --- a/src/assets/ba_data/python/baenv.py +++ b/src/assets/ba_data/python/baenv.py @@ -52,7 +52,7 @@ if TYPE_CHECKING: # Build number and version of the ballistica binary we expect to be # using. -TARGET_BALLISTICA_BUILD = 21945 +TARGET_BALLISTICA_BUILD = 21947 TARGET_BALLISTICA_VERSION = '1.7.37' diff --git a/src/ballistica/shared/ballistica.cc b/src/ballistica/shared/ballistica.cc index 2debbdf7..4cf52c5a 100644 --- a/src/ballistica/shared/ballistica.cc +++ b/src/ballistica/shared/ballistica.cc @@ -39,7 +39,7 @@ auto main(int argc, char** argv) -> int { namespace ballistica { // These are set automatically via script; don't modify them here. -const int kEngineBuildNumber = 21945; +const int kEngineBuildNumber = 21947; const char* kEngineVersion = "1.7.37"; const int kEngineApiVersion = 8; diff --git a/tools/bacommon/login.py b/tools/bacommon/login.py index 1c32775e..c1531c56 100644 --- a/tools/bacommon/login.py +++ b/tools/bacommon/login.py @@ -40,3 +40,15 @@ class LoginType(Enum): return 'Google Play Games' case cls.GAME_CENTER: return 'Game Center' + + @property + def displaynameshort(self) -> str: + """Human readable name for this value.""" + cls = type(self) + match self: + case cls.EMAIL: + return 'Email' + case cls.GPGS: + return 'GPGS' + case cls.GAME_CENTER: + return 'Game Center'