ksaa 2025.9.post2__py3-none-any.whl → 2025.11__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- kaa/__init__.py +0 -0
- kaa/application/__init__.py +0 -0
- kaa/application/core/misc_core.py +4 -1
- kaa/application/services/__init__.py +0 -0
- kaa/application/services/config_service.py +101 -0
- kaa/application/services/feedback_service.py +121 -0
- kaa/application/services/produce_solution_service.py +83 -0
- kaa/application/services/task_service.py +145 -0
- kaa/application/services/update_service.py +208 -0
- kaa/application/ui/__init__.py +0 -0
- kaa/application/ui/common.py +123 -0
- kaa/application/ui/components/alert.py +251 -0
- kaa/application/ui/components/alert.pyi +257 -0
- kaa/application/ui/components/categorized_select.pyi +697 -0
- kaa/application/ui/facade.py +189 -0
- kaa/application/ui/gradio_view.py +135 -0
- kaa/application/ui/views/__init__.py +0 -0
- kaa/application/ui/views/feedback_view.py +65 -0
- kaa/application/ui/views/produce_view.py +251 -0
- kaa/application/ui/views/settings_view.py +581 -0
- kaa/application/ui/views/status_view.py +171 -0
- kaa/application/ui/views/task_view.py +102 -0
- kaa/application/ui/views/update_view.py +106 -0
- kaa/config/schema.py +26 -6
- kaa/errors.py +75 -0
- kaa/main/dmm_host.py +60 -60
- kaa/main/gr.py +60 -3115
- kaa/main/kaa.py +11 -3
- kaa/metadata.py +10 -0
- kaa/resources/__pycache__/__init__.cpython-310.pyc +0 -0
- kaa/resources/game.db +0 -0
- kaa/resources/game_ver.txt +0 -0
- kaa/resources/idol_cards/i_card-skin-amao-3-014_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-amao-3-015_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-amao-3-015_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-atbm-1-000_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-atbm-1-000_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-atbm-2-000_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-atbm-2-000_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-atbm-3-000_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-atbm-3-000_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-fktn-3-016_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-fktn-3-016_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-hmsz-3-003_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-hmsz-3-003_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-hmsz-3-009_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-hmsz-3-009_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-hmsz-3-013_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-hmsz-3-013_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-hrnm-3-015_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-hrnm-3-015_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-hski-3-015_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-hski-3-015_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-hume-3-009_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-hume-3-009_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-hume-3-015_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-hume-3-015_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-jsna-3-009_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-jsna-3-009_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-jsna-3-014_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-jsna-3-014_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-kcna-3-014_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-kcna-3-014_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-kcna-3-015_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-kcna-3-015_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-kllj-3-014_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-kllj-3-014_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-shro-3-015_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-shro-3-015_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-ssmk-3-015_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-ssmk-3-015_1.png +0 -0
- kaa/resources/idol_cards/i_card-skin-ttmr-3-015_0.png +0 -0
- kaa/resources/idol_cards/i_card-skin-ttmr-3-015_1.png +0 -0
- kaa/sprites/0cdd57aa-9bdd-4c83-9565-de7c229b34e3.png +0 -0
- kaa/sprites/16f04ca1-05a3-49c7-88ae-a0d02c1ec2ec.png +0 -0
- kaa/sprites/20ca6d42-c19e-4c3e-b82c-f6642bbe5069.png +0 -0
- kaa/sprites/276c0178-65af-4b69-a3c3-d04253b9ed91.png +0 -0
- kaa/sprites/32de6ba0-859f-4f40-a57e-92bed913e3a7.png +0 -0
- kaa/sprites/38613745-1cf2-4bf1-9f58-0474b1e46895.png +0 -0
- kaa/sprites/41904062-e218-4b28-972a-b5cfcd058d2c.png +0 -0
- kaa/sprites/44097699-487f-4932-846a-095a427f4ed8.png +0 -0
- kaa/sprites/459f532f-115c-4527-a897-affa7ddcbd76.png +0 -0
- kaa/sprites/46cb87f6-26f7-45f0-b10c-6491f115077e.png +0 -0
- kaa/sprites/4b02f8d4-7847-47a5-8f01-7ab5123709e5.png +0 -0
- kaa/sprites/4b7426e9-395a-410c-bb99-c6f0a7b81208.png +0 -0
- kaa/sprites/4c243ed4-9ac2-42ba-89c6-946ffef84120.png +0 -0
- kaa/sprites/527c3803-1ddd-4f6b-a896-815d3c2e4caa.png +0 -0
- kaa/sprites/54d67100-70c7-4a00-afaa-a80771d34893.png +0 -0
- kaa/sprites/5588396d-dd38-4ef1-8c37-3041a750b1cc.png +0 -0
- kaa/sprites/5933f6ab-7af4-4731-aac8-d95939a3fbbf.png +0 -0
- kaa/sprites/5c49d3b3-656e-4c8c-ae1a-9b0209b9dcc3.png +0 -0
- kaa/sprites/5c735cc5-7801-44e9-a8f1-2d44df4fa919.png +0 -0
- kaa/sprites/678073ec-6700-4d94-af41-b392af11201b.png +0 -0
- kaa/sprites/6a27faad-df3b-49d9-a20f-64ae8e8f9e22.png +0 -0
- kaa/sprites/6b63fca9-a1ec-490e-96e9-fc0beeeb8851.png +0 -0
- kaa/sprites/6baaecdd-2817-4ba3-a2da-346ef9ef92fd.png +0 -0
- kaa/sprites/6c82d28f-913c-4444-baa6-2e37c7e24bc6.png +0 -0
- kaa/sprites/6d302c9d-72cd-49b5-bb11-c39140ffbdd1.png +0 -0
- kaa/sprites/6e603eb6-2336-46d2-ad01-2ba2fc3d4cbd.png +0 -0
- kaa/sprites/7156a1b5-cdd7-446e-9caf-d9f6b313ef4d.png +0 -0
- kaa/sprites/7469d458-d308-4469-8bf1-b63e1ddc6a3c.png +0 -0
- kaa/sprites/78868e34-1c2a-40ee-b08c-c89e6a3aea54.png +0 -0
- kaa/sprites/7c8e37b7-173f-4c03-8f11-bbd47f2a02c2.png +0 -0
- kaa/sprites/7ce3a2d5-efa7-4091-b012-f2870d9df422.png +0 -0
- kaa/sprites/7db2d761-ab44-4b3b-85aa-9b9758f97d5d.png +0 -0
- kaa/sprites/7ddaa9db-2287-43ba-8531-065e618ac8ef.png +0 -0
- kaa/sprites/7def2661-0847-4459-88c6-5270c2e8a32c.png +0 -0
- kaa/sprites/821c86c1-bc35-40bc-95db-f66935a92299.png +0 -0
- kaa/sprites/8448237d-2db5-49ca-8d55-9fc0e56639a7.png +0 -0
- kaa/sprites/89663a2f-c6d3-4bb7-9935-a54d11d0a382.png +0 -0
- kaa/sprites/8a312cf5-c670-4a52-a03b-fe55e78f8f07.png +0 -0
- kaa/sprites/8b6a1eed-341d-4be1-b0ae-9adc52ed4543.png +0 -0
- kaa/sprites/8e024c75-c872-4e18-bb80-0c5894612815.png +0 -0
- kaa/sprites/92f7ef0b-7931-4cd3-afda-c553232eb443.png +0 -0
- kaa/sprites/9803a197-d873-43cc-9656-d63513e92fad.png +0 -0
- kaa/sprites/9934f05f-ee5f-4131-b08d-aa61d5f3505a.png +0 -0
- kaa/sprites/993f2140-77be-4fe2-8e11-f71c4531bc9a.png +0 -0
- kaa/sprites/9a8bfa87-0e37-4d54-888f-b79f8778d232.png +0 -0
- kaa/sprites/9b7eaa4c-2b67-4426-80da-b7538a87ed96.png +0 -0
- kaa/sprites/9bc6607d-ce44-467e-a5f4-b3cf30210c13.png +0 -0
- kaa/sprites/9db5de82-8fba-4b69-8faf-ffe7fcea32f8.png +0 -0
- kaa/sprites/__pycache__/__init__.cpython-310.pyc +0 -0
- kaa/sprites/a1251011-00a9-402b-82da-1d2744db26cf.png +0 -0
- kaa/sprites/a31e08c1-d3c3-4a99-a882-4a10de9ba815.png +0 -0
- kaa/sprites/a408adaa-bfab-4aaf-acf7-08a4a3ebdd4c.png +0 -0
- kaa/sprites/a408cdfd-e394-4ada-9f0e-5878e41b8e52.png +0 -0
- kaa/sprites/a4723b5b-2466-4ea4-b7ef-4185bb4dda74.png +0 -0
- kaa/sprites/a5ba613c-46f4-4442-88e1-fbda4dd65a55.png +0 -0
- kaa/sprites/a88e3da2-98d3-4a64-b7ac-040847028a83.png +0 -0
- kaa/sprites/a9868db0-b355-470e-9bbe-033c5efa4b5e.png +0 -0
- kaa/sprites/a9f020e9-0e4b-4ddc-b8b8-386009578c15.png +0 -0
- kaa/sprites/aa369159-cc3b-40f2-9fca-bca5b579cf97.png +0 -0
- kaa/sprites/aad1ac7d-cfa1-4459-9d46-d39c080bd78e.png +0 -0
- kaa/sprites/ab9e39ae-0856-4254-a6b6-585e82f8bf3b.png +0 -0
- kaa/sprites/ae4742aa-acda-442d-bf73-b3fe7b66e85c.png +0 -0
- kaa/sprites/aff3d8ac-d648-434c-9adb-6c1a10aa04b9.png +0 -0
- kaa/sprites/affc5006-4b67-4490-9fa7-557a7fecb133.png +0 -0
- kaa/sprites/b002896d-5093-48e5-9e01-d18bfb240961.png +0 -0
- kaa/sprites/b00b5890-3743-4064-8311-c5e35b3afbe6.png +0 -0
- kaa/sprites/b26ac4ff-42a0-45aa-b818-7d7603b52f12.png +0 -0
- kaa/sprites/b2a04604-15d4-4ff6-86f7-0823e642103f.png +0 -0
- kaa/sprites/b33bb89c-cabb-4fe0-822f-d911e8b42f82.png +0 -0
- kaa/sprites/b5584de5-650e-4fde-b743-ccbd02eab196.png +0 -0
- kaa/sprites/b5f80604-d7d3-49e0-9934-58f75c393ffb.png +0 -0
- kaa/sprites/b70b958a-9480-4b9b-86a4-5ea099535c36.png +0 -0
- kaa/sprites/b93b3c36-79a3-4c1a-944a-20fe6a88c46d.png +0 -0
- kaa/sprites/ba7676fe-4982-4e92-822d-9c1a623420ac.png +0 -0
- kaa/sprites/bb953e97-7185-4c2c-b177-48d743e90d96.png +0 -0
- kaa/sprites/bd176e60-3bb2-453f-b2ef-45305b7f21c1.png +0 -0
- kaa/sprites/c0478a52-d6c5-4029-848f-e3e22b2de858.png +0 -0
- kaa/sprites/c05baa1e-02c3-4d02-904f-76086edbb97f.png +0 -0
- kaa/sprites/c295af98-0b43-4f18-bbc3-e59d23055f1b.png +0 -0
- kaa/sprites/c424f4a1-d032-478d-ac82-b1127a429e52.png +0 -0
- kaa/sprites/c5356ad6-0f1e-42be-b090-059f33ea7cee.png +0 -0
- kaa/sprites/c54d4b7e-887c-4753-8a9e-6914fc408232.png +0 -0
- kaa/sprites/c68f1282-4d86-4b1a-b76b-dcf42f3f906b.png +0 -0
- kaa/sprites/c71f900b-9689-4800-89a0-e3371d33f47a.png +0 -0
- kaa/sprites/c7cad813-2326-4662-9f55-0a15e1dad3dc.png +0 -0
- kaa/sprites/c95e8a90-dd6e-4cca-b74b-85ee90dbd5c1.png +0 -0
- kaa/sprites/c98d6bc7-45ca-4877-8cd1-6f36d6a86a02.png +0 -0
- kaa/sprites/ca258eea-e69a-43c3-ad4c-ac7da0099011.png +0 -0
- kaa/sprites/cb8d5df6-300b-48e5-ae0b-2b4750c9c092.png +0 -0
- kaa/sprites/cc727107-139b-4092-bafb-4bc9787bcdfd.png +0 -0
- kaa/sprites/cd601176-0336-41c7-8d3f-31ddf8cf708d.png +0 -0
- kaa/sprites/cda022d1-7898-4006-95c5-b55eceda9d95.png +0 -0
- kaa/sprites/ce22506b-7410-4039-94de-dc1bdba8ac00.png +0 -0
- kaa/sprites/cea2d5c4-6e79-425e-9e98-7e7dbdee960b.png +0 -0
- kaa/sprites/cf302432-c592-4b6f-a6de-53c3e1bef23e.png +0 -0
- kaa/sprites/d0d9f650-bb30-4743-81f3-cd7ea8211d5c.png +0 -0
- kaa/sprites/d14a1c6c-339a-4dfe-9078-950d3518bc3b.png +0 -0
- kaa/sprites/d277a9c3-2b2c-42fc-9fbb-a836413c8cf4.png +0 -0
- kaa/sprites/d50d4438-65bc-4849-9a11-7e8b796e1b9d.png +0 -0
- kaa/sprites/d5407f49-fecc-404e-915a-22c9fa16a79a.png +0 -0
- kaa/sprites/d73e9e03-b910-42c0-9953-34980bff09f5.png +0 -0
- kaa/sprites/d8485972-4e67-4190-8d95-60fd3c68b2ce.png +0 -0
- kaa/sprites/d963e76b-3c25-4bc7-a307-78d97728a819.png +0 -0
- kaa/sprites/dab08e98-9053-4e2a-9e74-cf30298fea22.png +0 -0
- kaa/sprites/db25f60d-4772-44f9-85dc-aba4b20cffa2.png +0 -0
- kaa/sprites/dcbeb7cd-cd57-4daf-b023-ff2c7ef1621a.png +0 -0
- kaa/sprites/dd6f31d1-510d-4425-a160-958e7e984382.png +0 -0
- kaa/sprites/de047f08-cef2-4b22-846e-fba2a06f8996.png +0 -0
- kaa/sprites/df11b01f-2ab1-4bfb-831f-bb8dae6a092b.png +0 -0
- kaa/sprites/e2f64c10-4db0-47c8-b23d-94802493d6fb.png +0 -0
- kaa/sprites/e4be69f6-6030-4fd8-8a36-fd3938d1734b.png +0 -0
- kaa/sprites/e4d0719b-d127-41a0-a250-492f79bf5625.png +0 -0
- kaa/sprites/e5196344-d61a-48ff-bc48-63f8f63c3788.png +0 -0
- kaa/sprites/e6f8f2a8-39e3-45e1-8a52-f2dc250bcd95.png +0 -0
- kaa/sprites/e70ce43b-9b3b-4aa0-8b9c-1d5cc4a1d5b0.png +0 -0
- kaa/sprites/e7c00f25-b15a-4403-a201-07b9b168e9f5.png +0 -0
- kaa/sprites/e82b9645-ee3f-4f63-922e-c1d703344baf.png +0 -0
- kaa/sprites/e9fad64b-e4e2-46cb-a820-b2860b38da03.png +0 -0
- kaa/sprites/eab111a6-80bf-45c1-9a74-b44ca76508b7.png +0 -0
- kaa/sprites/ec0d03db-7c66-46b7-86cc-4acaa6eba1c9.png +0 -0
- kaa/sprites/edd2d38d-9071-4094-8931-1a68b6ebe1b8.png +0 -0
- kaa/sprites/eeff3d53-5a40-44c2-9d09-8f246157c72b.png +0 -0
- kaa/sprites/ef0db31a-fc44-4972-af7e-21c50f0b139c.png +0 -0
- kaa/sprites/f1fa2fc3-c3d4-4040-90f1-7941b98dcee5.png +0 -0
- kaa/sprites/f31531b4-79ea-41dc-b23f-e445b818139c.png +0 -0
- kaa/sprites/f35e19ca-7de7-4721-af53-b5f95c5e74fe.png +0 -0
- kaa/sprites/f5e1e7ed-fd35-42c3-97ed-5e9214a50733.png +0 -0
- kaa/sprites/f7246b84-e70b-47d3-8166-90f0dc4f2bb6.png +0 -0
- kaa/sprites/f7e8e937-1eda-4bd3-a3cf-d306cb1973e2.png +0 -0
- kaa/sprites/f8babf59-d55e-40c2-a0b7-5d743ab71799.png +0 -0
- kaa/sprites/f9697f23-07cf-4a14-8b22-d1fc95386c16.png +0 -0
- kaa/sprites/fad8b65b-7d9e-49d8-9f71-6d078aa672ca.png +0 -0
- kaa/sprites/fb017237-bac6-4b73-9437-4518e764ef45.png +0 -0
- kaa/sprites/fc86085c-d708-498a-bfa6-92e1a1364c60.png +0 -0
- kaa/tasks/R.py +140 -128
- kaa/tasks/common.py +5 -0
- kaa/tasks/daily/contest.py +2 -1
- kaa/tasks/daily/purchase.py +34 -2
- kaa/tasks/daily/upgrade_support_card.py +12 -2
- kaa/tasks/produce/cards.py +5 -4
- kaa/tasks/produce/common.py +202 -105
- kaa/tasks/produce/in_purodyuusu.py +35 -17
- kaa/tasks/produce/non_lesson_actions.py +10 -33
- kaa/tasks/produce/p_drink.py +5 -1
- kaa/tasks/produce/produce.py +12 -1
- kaa/tasks/start_game.py +61 -5
- kaa/util/reactive.py +182 -0
- {ksaa-2025.9.post2.dist-info → ksaa-2025.11.dist-info}/METADATA +31 -27
- {ksaa-2025.9.post2.dist-info → ksaa-2025.11.dist-info}/RECORD +354 -176
- /kaa/sprites/{3504b421-58f2-4ca0-869e-764335d60406.png → 001486b2-f627-4ece-8c93-4dfec47da9b3.png} +0 -0
- /kaa/sprites/{7dc79a8b-bd59-4c93-a638-e49bca276c00.png → 011e352f-6e8b-4225-b104-d1b2ccf0761c.png} +0 -0
- /kaa/sprites/{69f15152-8ee9-4e39-9bfa-6cd1b051bc1e.png → 0240342e-b6f3-4ed6-8da5-a64092e6fcde.png} +0 -0
- /kaa/sprites/{15801cb7-24f6-4504-921b-5e5a37bdc064.png → 02df555c-b19c-4776-8f1b-d1a7e2ed2f82.png} +0 -0
- /kaa/sprites/{55a2ba58-2412-4c39-9c6e-2627092623a2.png → 0343a3b8-8cd6-47af-b956-760dd2c79711.png} +0 -0
- /kaa/sprites/{d62dab9b-d36d-490e-bca5-bfd4b66911d7.png → 04c287ed-9ab1-4cd1-af07-8ab61f7f49bc.png} +0 -0
- /kaa/sprites/{8d99cd97-ae34-488f-b62e-54d54f75e4e8.png → 05d7740b-c6ea-453a-b805-7d0a5fe18184.png} +0 -0
- /kaa/sprites/{66ccbeba-3291-4f1c-8669-d691f24ea9ed.png → 06a7097c-fef6-4f2c-bece-26eed414708e.png} +0 -0
- /kaa/sprites/{609a340b-2cfa-4cef-9e55-fb60c7cabdbb.png → 072b167f-a2f6-4458-815e-a92ca2e6c9eb.png} +0 -0
- /kaa/sprites/{e881ee18-154e-4f0c-91fe-4699d156671d.png → 0899a6e7-6617-4f11-a7a2-9ba377ad6cba.png} +0 -0
- /kaa/sprites/{689eebfd-984c-45c9-812f-26cf9c756bed.png → 0950d760-6d88-4265-b28c-0790a782a749.png} +0 -0
- /kaa/sprites/{76d5d7f7-b23d-4802-8f91-7058f7adcffd.png → 0a019c0d-26fa-4441-b281-b73060722bc9.png} +0 -0
- /kaa/sprites/{ac194536-54e4-49e7-992c-fc82ba401f10.png → 0a27a783-0ef8-4f99-8c26-cf89768b5146.png} +0 -0
- /kaa/sprites/{06ee3b1e-5c99-4ebf-8a23-d6f59cda32b8.png → 0af981f5-bcc9-48eb-a392-50f79ec5149a.png} +0 -0
- /kaa/sprites/{e7709d81-890b-438f-8acb-50492d63022e.png → 0afb71f5-0752-47af-9ba2-85bdbe4fcbf7.png} +0 -0
- /kaa/sprites/{62cc930f-acc2-424a-975f-164009a555f8.png → 0b83c2e5-ebb4-4a69-8b5f-658774d4c5a6.png} +0 -0
- /kaa/sprites/{ad63136d-2360-45e6-b7ef-00e01612c7ce.png → 0be5a84d-eb1e-4bb3-afcd-923e104190f4.png} +0 -0
- /kaa/sprites/{be2985ff-c3ac-4d94-9751-c652dd561db2.png → 0c192ca4-dd10-49b4-b0be-9b1fb4637910.png} +0 -0
- /kaa/sprites/{bca22a82-f72b-46ca-be06-c1e18b7ad27c.png → 0cae32b3-0248-49ad-98dd-d06a89308797.png} +0 -0
- /kaa/sprites/{a694f6e8-6ef9-4761-816a-ad586ce93654.png → 0d1fd6f0-3a6f-4008-a31a-8189dd09be50.png} +0 -0
- /kaa/sprites/{cde4da05-d654-4217-8443-752bc0709742.png → 0d2143fa-7e81-4e7a-8a94-c3839719de5b.png} +0 -0
- /kaa/sprites/{901b48f9-d7b7-46c2-85fa-b07e427ffdaa.png → 0dbb752b-e60a-459d-80fa-f5b49e8b8e4d.png} +0 -0
- /kaa/sprites/{80fa9c6e-fe05-4d3e-ae50-6b7e9a237e0b.png → 0e63e0b7-6874-46e9-86de-8c23e6491f24.png} +0 -0
- /kaa/sprites/{603c5369-9247-404d-bc6d-4719d11de6ea.png → 0f4ac9ae-5e4d-4f3f-b9e0-b76570f2b040.png} +0 -0
- /kaa/sprites/{7f90beb9-8712-4a53-a818-ff7a5e82d71d.png → 0f8026e8-62a9-49e5-97a6-0d78f33dcfcf.png} +0 -0
- /kaa/sprites/{6bcebf50-764b-4bf2-be8e-ba241d8550d7.png → 0f80ac6f-bdf8-4927-8393-c554209f517a.png} +0 -0
- /kaa/sprites/{4396a9b8-b7f0-45f3-8a8f-85773a10eecb.png → 116d3f3a-0255-47ed-b656-c26b41a5cfa8.png} +0 -0
- /kaa/sprites/{9a0172aa-9489-4985-9c65-c5f6db0a0325.png → 130cd7fd-767e-4177-9087-71f418f154dd.png} +0 -0
- /kaa/sprites/{333a1e30-82d3-45b9-8e48-4c127bcb5ec6.png → 138a527b-2191-4f0f-9e36-1d08bbf6ffb1.png} +0 -0
- /kaa/sprites/{cee6ca8f-219c-448d-9ba6-d6722f27b600.png → 1472da80-4cbb-41e1-94e8-3ea3defd3b6f.png} +0 -0
- /kaa/sprites/{94121408-8cd2-46fc-bf27-33b207e4cba8.png → 14875449-7478-4969-a2d5-91ce34c9d1e4.png} +0 -0
- /kaa/sprites/{15da6f78-d89f-480c-9cce-c95e009fd15a.png → 1539fcff-8842-478f-98a8-0d1a885d1b43.png} +0 -0
- /kaa/sprites/{97329116-4d2e-40d7-af96-938afdac4e60.png → 16113270-3f35-498a-a29a-52f190d77cc1.png} +0 -0
- /kaa/sprites/{545068ad-6f17-40d8-99e1-d26bd5700c67.png → 1617c180-ce9f-461a-bfdc-390337ecb205.png} +0 -0
- /kaa/sprites/{e38a2f35-9ac5-4363-bd6d-09893907ea71.png → 16cf9d8b-4f8e-47ce-a63d-fe9bfc3f31e8.png} +0 -0
- /kaa/sprites/{4fc6fae5-386d-434c-893d-5450bd5a6396.png → 1b485aa9-f0c0-4b49-ba75-363a8d6e292c.png} +0 -0
- /kaa/sprites/{4995d301-375b-4d23-a6e5-b26a771fcbe4.png → 1d560b06-feac-413d-bf90-07ac045f11fb.png} +0 -0
- /kaa/sprites/{e16b116c-6a2c-4e5d-8105-8dfc8c4c730f.png → 1d92cb8e-49a7-4166-9682-a5807e0c7912.png} +0 -0
- /kaa/sprites/{be04f096-c46b-4784-8e6c-c1217764f6dd.png → 1dadf765-ddd0-4768-9e91-6d3d08d0ca0d.png} +0 -0
- /kaa/sprites/{d0652541-e289-4bcd-98ec-a88715f5adef.png → 20cbf6b8-01db-45fe-a790-dbb7dd639b1d.png} +0 -0
- /kaa/sprites/{8c4f60d1-d707-4ae5-bd94-d96661ea7bbc.png → 20d01fc0-9a54-4ef5-9983-2bb8414dd94d.png} +0 -0
- /kaa/sprites/{011c52b9-613d-4865-afd3-1f0ddab2bc5b.png → 20e1e948-6920-44cd-965e-9e1e37b3fbf2.png} +0 -0
- /kaa/sprites/{5ee1b47b-f20d-431b-a0bb-d203b9f3e15b.png → 23922edd-22aa-4514-ba99-65bcd72c2ad1.png} +0 -0
- /kaa/sprites/{3d57da0a-b166-4acd-9a8a-b247ba5ad13a.png → 24c2db22-24e2-484e-8c16-8b1c9fe3ed14.png} +0 -0
- /kaa/sprites/{f5145781-949e-4012-9ea9-b0a277dac72b.png → 26683d54-74a9-4e7b-a839-c2e0850d1458.png} +0 -0
- /kaa/sprites/{2987cb9c-5975-41b3-87f7-cc26efdcee74.png → 27bcc513-9bab-468a-97b8-ed16f918e2a4.png} +0 -0
- /kaa/sprites/{c24394f6-ed02-4fb4-8d58-40a7e51b259d.png → 284a19c3-2c06-48a5-8f78-b4682e8ae19e.png} +0 -0
- /kaa/sprites/{da615a2f-3334-462c-8535-40067ad1c857.png → 2927cceb-29dc-4c35-8614-1df42fc0733b.png} +0 -0
- /kaa/sprites/{0a430b29-9841-407a-a102-ea6420beeaae.png → 2c5784df-e89b-4b95-a4b9-bac083c0ec08.png} +0 -0
- /kaa/sprites/{3867054e-a686-4dab-89fb-6a9def58dfe1.png → 2dfa926c-83c5-4f40-adfe-ff04ce448264.png} +0 -0
- /kaa/sprites/{d1a6547e-7c58-4500-a7f4-cf462f44395f.png → 2f7f70ea-f3f0-4d14-8885-1a735ff00545.png} +0 -0
- /kaa/sprites/{4a5e8c39-4e80-4202-9886-be1a58073fd6.png → 307fcb37-7a90-4a3e-bd3a-64a691aeb5d5.png} +0 -0
- /kaa/sprites/{151dc2ce-fce4-4741-ac6e-cc8213f54137.png → 3114b2d5-0a96-4eba-9143-b09eabb63612.png} +0 -0
- /kaa/sprites/{1aa14c42-8682-4a75-b4a2-4715481a2381.png → 31168fe2-8601-4de6-aa40-81e7ce452391.png} +0 -0
- /kaa/sprites/{f3400d73-4f61-4027-b5d8-03765a63a186.png → 31b025df-ed25-4bc4-a94a-d05388e9156e.png} +0 -0
- /kaa/sprites/{0c211c20-096e-4572-8e74-3867904db1f6.png → 32af48d2-fb5b-4288-930f-eb36edfe2116.png} +0 -0
- /kaa/sprites/{0803c844-7085-4492-ad68-0ce3b11f9840.png → 34e50d77-7b95-4bb7-8c62-ad6801dc0e55.png} +0 -0
- /kaa/sprites/{bd5b168a-de03-46b3-b1b7-9fa9667f4642.png → 3658a26d-98d3-462a-abf4-4d8b74aeb134.png} +0 -0
- /kaa/sprites/{562deb0a-99bd-4e95-80ff-f933a73c28ad.png → 36f11c55-e110-44b7-a800-85f4d7584560.png} +0 -0
- /kaa/sprites/{9c827df9-2e47-4bec-95b7-8ccad6377a28.png → 38bb2a90-b2a9-4f85-9025-662e83ab1ed1.png} +0 -0
- /kaa/sprites/{eebbccac-25a9-465e-b7c8-3bfdaf0bf0b9.png → 38f70a7e-5f7e-4ee6-a7c5-5f8014734719.png} +0 -0
- /kaa/sprites/{6f79221a-8c47-423e-ac72-27d97c559d63.png → 3aceddce-09db-422a-8023-e08d41070cc8.png} +0 -0
- /kaa/sprites/{3fe4ec28-3b2a-4042-ace1-ceec5c8f48b1.png → 3c224540-1571-435a-b8e6-2317e4411438.png} +0 -0
- /kaa/sprites/{f2913d0b-342c-4de0-8235-fe3f1c580d2e.png → 3d9a9493-7616-4b2b-867e-44e776d831c0.png} +0 -0
- /kaa/sprites/{a8bef06b-9287-4f54-b96e-19463031d26f.png → 3fd694ea-8396-4cf3-9ba6-eaf95b61e8c8.png} +0 -0
- /kaa/sprites/{fd16e035-699c-4dc9-9721-61443cd6fd63.png → 4055dbef-1523-43b7-9183-6b2721b4307b.png} +0 -0
- /kaa/sprites/{606d4740-8af9-40f6-af18-ad9f73cecf68.png → 4059ec2d-cd20-4dd3-8586-e49a4cfa8717.png} +0 -0
- /kaa/sprites/{9ea3c9b4-80f3-44b9-90e3-cfc406f814be.png → 4280fa1d-4223-4fc4-85f9-caf6157cb004.png} +0 -0
- /kaa/sprites/{436ec8e4-aa4a-4b1f-940a-2ab55baa098d.png → 43bc2116-7fe3-4b20-8c8b-3ab2a2b5dd7d.png} +0 -0
- /kaa/sprites/{39815c36-38c5-4066-aff5-2177c232b4f4.png → 43d3fe01-27c0-4d3f-a908-aebd00ab219d.png} +0 -0
- /kaa/sprites/{9c6378a9-62ed-4881-bc6f-2166bbb470c7.png → 45062c9b-a31d-457b-83a2-9b6891384a15.png} +0 -0
- /kaa/sprites/{e630b33a-e73e-4271-96b9-860b94fb48ca.png → 4516d0e4-9280-4f91-ba7d-fc8af83a9996.png} +0 -0
- /kaa/sprites/{916391a4-09b7-409c-ba25-391b61a65e62.png → 458b8bbe-9fa5-48d4-907b-66d36baf16a1.png} +0 -0
- /kaa/sprites/{9092a171-66f0-47dc-99dd-bb5d7359077a.png → 45af668c-2324-4fe4-83e0-11d65cfaa086.png} +0 -0
- /kaa/sprites/{297fb9e0-9553-40fb-ad08-f5ab718ef119.png → 45bdb006-bea5-4a1f-bf1a-c3bcb2e99abd.png} +0 -0
- /kaa/sprites/{1bf95df3-255f-4e89-9b17-0af77f4affd6.png → 47186b16-f478-4a53-8e49-a132ee4c78db.png} +0 -0
- /kaa/sprites/{1f6805bb-dff1-4d4c-82bf-74563056cc81.png → 4876c6f3-17a5-4858-b1d1-ebb5619516c5.png} +0 -0
- /kaa/sprites/{b2c8ac50-87a3-4cdd-a895-9704a9674163.png → 491bd489-7a08-47b4-b1b7-5d0f44cedbca.png} +0 -0
- /kaa/sprites/{484594b4-06a2-4ec3-8a85-e7af3b012125.png → 4a853ac5-24d5-44ac-8ddf-9f501c60a9be.png} +0 -0
- /kaa/sprites/{f6e26f3c-2548-4507-8651-53917e0fe82a.png → 4b88639e-1f17-4e11-90b6-bb122f8cb5ab.png} +0 -0
- /kaa/sprites/{935d8115-245f-42ff-ad74-55f4e6d140b1.png → 4dc5f817-86bc-4433-aeb5-b02c7b63fa8c.png} +0 -0
- /kaa/sprites/{b379d704-fc45-42f9-a45c-d81a6c5ee951.png → 4e3a9fd3-86aa-4e14-ae48-46e53a553da2.png} +0 -0
- /kaa/sprites/{7df9b645-ff88-4459-8ba7-450da538cfd9.png → 4e7f7b91-344c-4fb2-95fe-004831e81b11.png} +0 -0
- /kaa/sprites/{24b3cf5c-0586-41cc-abfb-df48de07fa77.png → 511232f6-01d6-482a-81a3-2bf79a6e88ed.png} +0 -0
- /kaa/sprites/{101a9c54-ab8c-4b5d-a4e0-686b93b4e1d9.png → 546cb160-f99b-4cda-9719-02b38a5393a0.png} +0 -0
- /kaa/sprites/{74e4c222-0006-4295-99d0-a01aa8b94dc2.png → 56bc2743-5dd9-4d09-a681-af9d1fec568b.png} +0 -0
- /kaa/sprites/{d11f07b1-f2e9-4c41-9ad9-81529121afd4.png → 5701ecbe-7fed-435c-b409-75f8b0f2df51.png} +0 -0
- /kaa/sprites/{6dd4ca2b-69ca-4099-9e69-2144ce9a4d28.png → 58de1cf0-4270-4987-9dc7-3f584f1119d1.png} +0 -0
- /kaa/sprites/{48eb2e27-7419-4136-9642-7af1a6f83ed9.png → 5a337f99-8554-48bf-acb7-364259fbf1b7.png} +0 -0
- /kaa/sprites/{ccad6a54-73f6-48b8-a86f-16b9e0f46e41.png → 5cb4deb9-2ec5-4452-aba4-390eae2071c7.png} +0 -0
- /kaa/sprites/{f136dd9f-43c8-44cc-b081-1f86d7ce38d4.png → 5d42f16f-3475-4ffb-ac85-3c86fa8fba46.png} +0 -0
- /kaa/sprites/{52aba1bd-1e82-46a7-8003-0aac11586a38.png → 6c5698a4-b211-4f38-83a7-51b5f3a36911.png} +0 -0
- /kaa/sprites/{0ec56b89-81f2-478d-907e-b04aab199e86.png → 771d1e17-8ef4-417a-b482-26db514e17c6.png} +0 -0
- /kaa/sprites/{c23c29cc-ef42-46d8-8b58-283b74a254cc.png → 7833fa1e-c842-4efd-a696-c67150a1dfa8.png} +0 -0
- /kaa/sprites/{2bb41b59-61f8-4109-a550-faa6a14708de.png → 791b3367-fb7c-48b5-9a0f-877908e51c4a.png} +0 -0
- /kaa/sprites/{47cbfa79-0b33-4ccc-b762-21e3a141a7bc.png → 7bb874a3-3fac-4138-83bd-d6461c5793d3.png} +0 -0
- /kaa/sprites/{fc77cc87-f8eb-4b33-834c-ee5d2af5ca44.png → 7d4d06a8-7903-4803-a20b-7f45ffbe9ca7.png} +0 -0
- /kaa/sprites/{b581ae5b-cb67-4bf9-8ffe-72b8ba56d887.png → 81553259-3b0a-42f7-b7b9-2c6e1dfec6c4.png} +0 -0
- /kaa/sprites/{eda88516-ac6b-4f26-b074-f8e6e2ae42a5.png → 827cec52-d883-46d1-b24b-c11c82b1b459.png} +0 -0
- /kaa/sprites/{9966acd5-973a-4afb-a006-c1fa66cfe679.png → 8473bc42-1909-4d70-b80d-7eba085c9978.png} +0 -0
- /kaa/sprites/{c16ae471-7d60-4c1f-9981-1090414a7ea0.png → 84797a78-97f3-44fa-b3c0-132c914f534a.png} +0 -0
- /kaa/sprites/{df54b1e4-035c-4937-9360-19b4733826e6.png → 861bd6b8-cca7-46b1-9346-83af080e211b.png} +0 -0
- /kaa/sprites/{436b9822-c946-4d2e-a432-8f3159705b37.png → 8f5081e4-ed3d-445b-bcf6-2e40c7d08298.png} +0 -0
- /kaa/sprites/{5bb33faa-8236-4e17-92bd-ad709795f261.png → 91dbaa9c-7881-4687-bd64-8f25c201d98c.png} +0 -0
- /kaa/sprites/{95e11d11-f330-4906-a128-6492f95176e8.png → 93f3f6a9-e9d2-45b7-a2b3-1e8b64d10e9b.png} +0 -0
- /kaa/sprites/{dd59548d-0800-49d3-8701-b2b2e8512c36.png → 943cde40-f190-40b6-9235-4439fbb4ae50.png} +0 -0
- /kaa/sprites/{7678902c-57df-4cf8-87ef-11c85f02214b.png → 97f3fb5a-fce2-4cc5-9da5-f0496e9dd294.png} +0 -0
- /kaa/sprites/{d051b4c3-354e-4d69-95f6-14f5017ed79e.png → 98a68736-c4ec-4af1-ac64-40eb48f9c000.png} +0 -0
- /kaa/sprites/{a9029026-7a7e-4f8e-9620-bd451bfdf284.png → 9af13381-661d-41cf-b704-e4a9c3691e14.png} +0 -0
- /kaa/sprites/{5a892ef3-543b-4fad-bdca-5358314d6be7.png → 9b91dc78-49e8-41b2-9500-c27cb46023c4.png} +0 -0
- /kaa/sprites/{920ea830-31a8-4256-b247-7b9507030783.png → 9d0bf64a-2684-43fa-b9bf-552e60c717b4.png} +0 -0
- /kaa/sprites/{b37685c3-74a8-4393-ad79-c445ab2d77be.png → a32fa779-2fb9-488e-9153-0b99e4352281.png} +0 -0
- /kaa/sprites/{9f81bc0f-da2c-4321-a185-b2d8a3f0d390.png → a6269fe5-e719-43ad-b674-ea728e43066b.png} +0 -0
- /kaa/sprites/{2beaba86-119e-4a1c-8cf4-e03c4d0d957a.png → a8ca6a10-ba0a-4416-a27b-3323d38040ab.png} +0 -0
- /kaa/sprites/{f258af39-e8be-4e19-aafc-bfedce9793c0.png → acaea032-45b8-4ad8-8b54-ff011750af80.png} +0 -0
- /kaa/sprites/{ed7adff5-1604-4ade-ac2b-a30167ef457c.png → ae5a051e-37f5-4e54-bfc7-64c445ad6fcc.png} +0 -0
- /kaa/sprites/{30604b47-7c8b-4dd5-b926-fd33bad575c7.png → af5a6ae7-a355-492e-86a8-62fa2b06bb54.png} +0 -0
- /kaa/sprites/{36e6c1ea-8de5-4640-8340-b8f532ef40c0.png → b406baf0-fa0b-4125-adc6-d370582a6104.png} +0 -0
- /kaa/sprites/{42bfc60c-0249-4910-ad04-80e559b52c6b.png → b62f9c30-1faf-47fc-be8f-36db3806c5dc.png} +0 -0
- /kaa/sprites/{56bcde1a-5cd7-493d-a2cd-2a63394c0c36.png → ba1983ce-bf63-4022-9ef3-dcf97030e6c5.png} +0 -0
- /kaa/sprites/{8e648675-1a52-4926-92cf-64c7cb5c2a59.png → ba971684-1fe3-47e1-8bdb-d20a0011ea68.png} +0 -0
- /kaa/sprites/{3af1e6de-e718-4a09-8ee9-88be21cd4b3d.png → bdbed86f-553c-458e-9435-d587005b367d.png} +0 -0
- /kaa/sprites/{e2944d47-159f-4200-b476-8d5db41d30c0.png → bee41ab5-c62e-4a79-a8d0-40f9efbc7e40.png} +0 -0
- /kaa/sprites/{bfaf3273-76bf-457a-88b7-6816af742a30.png → c344b05d-2707-43b0-9e3e-4ec433558dcb.png} +0 -0
- /kaa/sprites/{7df273dc-69f7-45b9-a782-b221783f851b.png → c3c495a2-1530-439f-a10e-76ca5d929cce.png} +0 -0
- /kaa/sprites/{76262c30-a2ee-45ba-8279-ca682cee0bd6.png → ccac6d8e-bca2-4ab6-b88b-c0f5ba83df84.png} +0 -0
- /kaa/sprites/{574b2741-c4ac-4ee4-a544-f4f499e4a21e.png → ce7cec02-4039-4171-87ed-37eccc4ac832.png} +0 -0
- /kaa/sprites/{6dead493-c4e6-4ba9-ac56-abe8c511abbd.png → f72e9d65-68e7-4bb6-be44-4b5ed71f0bce.png} +0 -0
- {ksaa-2025.9.post2.dist-info → ksaa-2025.11.dist-info}/WHEEL +0 -0
- {ksaa-2025.9.post2.dist-info → ksaa-2025.11.dist-info}/entry_points.txt +0 -0
- {ksaa-2025.9.post2.dist-info → ksaa-2025.11.dist-info}/licenses/LICENSE +0 -0
- {ksaa-2025.9.post2.dist-info → ksaa-2025.11.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import gradio as gr
|
|
2
|
+
from kaa.application.ui.facade import KaaFacade, ConfigValidationError
|
|
3
|
+
from kaa.application.ui.common import GradioComponents
|
|
4
|
+
|
|
5
|
+
class StatusView:
|
|
6
|
+
def __init__(self, facade: KaaFacade, components: GradioComponents):
|
|
7
|
+
self.facade = facade
|
|
8
|
+
self.components = components
|
|
9
|
+
|
|
10
|
+
def create_ui(self):
|
|
11
|
+
"""Creates the content for the 'Status' tab."""
|
|
12
|
+
gr.Markdown("## 状态")
|
|
13
|
+
|
|
14
|
+
def _get_end_action_value() -> str:
|
|
15
|
+
end_game_opts = self.facade.config_service.get_options().end_game
|
|
16
|
+
if end_game_opts.shutdown:
|
|
17
|
+
return "完成后关机"
|
|
18
|
+
if end_game_opts.hibernate:
|
|
19
|
+
return "完成后休眠"
|
|
20
|
+
return "完成后什么都不做"
|
|
21
|
+
|
|
22
|
+
with gr.Row():
|
|
23
|
+
run_btn = gr.Button("启动", scale=0, variant='primary', min_width=300)
|
|
24
|
+
pause_btn = gr.Button("暂停", scale=0)
|
|
25
|
+
with gr.Column(scale=0):
|
|
26
|
+
end_action_dropdown = gr.Dropdown(
|
|
27
|
+
show_label=False,
|
|
28
|
+
choices=["完成后什么都不做", "完成后关机", "完成后休眠"],
|
|
29
|
+
value=_get_end_action_value(),
|
|
30
|
+
interactive=True,
|
|
31
|
+
elem_classes="no-padding-dropdown",
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
self.components.run_btn = run_btn
|
|
35
|
+
self.components.pause_btn = pause_btn
|
|
36
|
+
self.components.end_action_dropdown = end_action_dropdown
|
|
37
|
+
|
|
38
|
+
gr.Markdown("### 快速设置")
|
|
39
|
+
|
|
40
|
+
with gr.Row():
|
|
41
|
+
select_all_btn = gr.Button("全选", scale=0)
|
|
42
|
+
unselect_all_btn = gr.Button("清空", scale=0)
|
|
43
|
+
select_produce_only_btn = gr.Button("只选培育", scale=0)
|
|
44
|
+
unselect_produce_only_btn = gr.Button("只不选培育", scale=0)
|
|
45
|
+
|
|
46
|
+
with gr.Row(elem_classes=["quick-controls-row"]):
|
|
47
|
+
opts = self.facade.config_service.get_options()
|
|
48
|
+
purchase_quick = gr.Checkbox(label="商店", value=opts.purchase.enabled, interactive=True)
|
|
49
|
+
assignment_quick = gr.Checkbox(label="工作", value=opts.assignment.enabled, interactive=True)
|
|
50
|
+
contest_quick = gr.Checkbox(label="竞赛", value=opts.contest.enabled, interactive=True)
|
|
51
|
+
produce_quick = gr.Checkbox(label="培育", value=opts.produce.enabled, interactive=True)
|
|
52
|
+
mission_reward_quick = gr.Checkbox(label="任务", value=opts.mission_reward.enabled, interactive=True)
|
|
53
|
+
club_reward_quick = gr.Checkbox(label="社团", value=opts.club_reward.enabled, interactive=True)
|
|
54
|
+
activity_funds_quick = gr.Checkbox(label="活动费", value=opts.activity_funds.enabled, interactive=True)
|
|
55
|
+
presents_quick = gr.Checkbox(label="礼物", value=opts.presents.enabled, interactive=True)
|
|
56
|
+
capsule_toys_quick = gr.Checkbox(label="扭蛋", value=opts.capsule_toys.enabled, interactive=True)
|
|
57
|
+
upgrade_support_card_quick = gr.Checkbox(label="支援卡", value=opts.upgrade_support_card.enabled, interactive=True)
|
|
58
|
+
|
|
59
|
+
self.components.quick_checkboxes = [
|
|
60
|
+
purchase_quick, assignment_quick, contest_quick, produce_quick,
|
|
61
|
+
mission_reward_quick, club_reward_quick, activity_funds_quick, presents_quick,
|
|
62
|
+
capsule_toys_quick, upgrade_support_card_quick
|
|
63
|
+
]
|
|
64
|
+
|
|
65
|
+
if self.facade._kaa.upgrade_msg:
|
|
66
|
+
gr.Markdown('### 配置升级报告')
|
|
67
|
+
gr.Markdown(self.facade._kaa.upgrade_msg)
|
|
68
|
+
gr.Markdown('脚本报错或者卡住?前往"反馈"选项卡可以快速导出报告!')
|
|
69
|
+
|
|
70
|
+
if self.facade.config_service.get_current_user_config().keep_screenshots:
|
|
71
|
+
gr.Markdown(
|
|
72
|
+
'<div style="color: red; font-size: larger;">当前启用了调试功能「保留截图数据」,调试结束后正常使用时建议关闭此选项!</div>'
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
with gr.Row():
|
|
76
|
+
task_runtime_text = gr.Textbox(
|
|
77
|
+
label="任务运行时间",
|
|
78
|
+
value="未运行",
|
|
79
|
+
interactive=False,
|
|
80
|
+
scale=1
|
|
81
|
+
)
|
|
82
|
+
self.components.task_runtime_text = task_runtime_text
|
|
83
|
+
|
|
84
|
+
task_status_df = gr.Dataframe(headers=["任务", "状态"], label="任务状态")
|
|
85
|
+
self.components.task_status_df = task_status_df
|
|
86
|
+
|
|
87
|
+
# --- Event Handlers ---
|
|
88
|
+
|
|
89
|
+
def on_run_click():
|
|
90
|
+
if self.facade.task_service.is_running_all:
|
|
91
|
+
self.facade.stop_all_tasks()
|
|
92
|
+
else:
|
|
93
|
+
self.facade.start_all_tasks()
|
|
94
|
+
|
|
95
|
+
def on_pause_click():
|
|
96
|
+
self.facade.toggle_pause()
|
|
97
|
+
|
|
98
|
+
def save_quick_setting(success_msg: str, failed_msg: str):
|
|
99
|
+
"""保存快速设置并立即应用"""
|
|
100
|
+
try:
|
|
101
|
+
# 保存配置
|
|
102
|
+
msg = self.facade.save_configs()
|
|
103
|
+
# 尝试热重载配置
|
|
104
|
+
gr.Success(success_msg)
|
|
105
|
+
except (ConfigValidationError, RuntimeError) as e:
|
|
106
|
+
gr.Warning(str(e))
|
|
107
|
+
except Exception as e:
|
|
108
|
+
gr.Error(f"保存失败: {e}")
|
|
109
|
+
|
|
110
|
+
def update_and_save_quick_setting(field_name: str, value: bool, display_name: str):
|
|
111
|
+
"""更新字段,并保存快速设置并立即应用"""
|
|
112
|
+
# 更新配置
|
|
113
|
+
options = self.facade.config_service.get_options()
|
|
114
|
+
parts = field_name.split('.')
|
|
115
|
+
obj = options
|
|
116
|
+
for part in parts[:-1]:
|
|
117
|
+
obj = getattr(obj, part)
|
|
118
|
+
setattr(obj, parts[-1], value)
|
|
119
|
+
save_quick_setting(
|
|
120
|
+
f"✓ {display_name} 已{'启用' if value else '禁用'}",
|
|
121
|
+
f"⚠ {display_name} 设置已保存但重载失败"
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
def batch_select(default: bool, produce_only: bool, success_msg: str):
|
|
125
|
+
opts = self.facade.config_service.get_options()
|
|
126
|
+
opts.purchase.enabled = default
|
|
127
|
+
opts.assignment.enabled = default
|
|
128
|
+
opts.contest.enabled = default
|
|
129
|
+
opts.produce.enabled = produce_only
|
|
130
|
+
opts.mission_reward.enabled = default
|
|
131
|
+
opts.club_reward.enabled = default
|
|
132
|
+
opts.activity_funds.enabled = default
|
|
133
|
+
opts.presents.enabled = default
|
|
134
|
+
opts.capsule_toys.enabled = default
|
|
135
|
+
opts.upgrade_support_card.enabled = default
|
|
136
|
+
save_quick_setting(success_msg, "⚠ 数据已保存,但重新加载失败")
|
|
137
|
+
|
|
138
|
+
def save_quick_end_action(action: str):
|
|
139
|
+
opts = self.facade.config_service.get_options().end_game
|
|
140
|
+
if action == "完成后关机":
|
|
141
|
+
opts.shutdown = True
|
|
142
|
+
opts.hibernate = False
|
|
143
|
+
elif action == "完成后休眠":
|
|
144
|
+
opts.shutdown = False
|
|
145
|
+
opts.hibernate = True
|
|
146
|
+
else: # This covers "完成后什么都不做"
|
|
147
|
+
opts.shutdown = False
|
|
148
|
+
opts.hibernate = False
|
|
149
|
+
save_quick_setting(f"✓ 完成后操作已设置为 {action}", "⚠ 设置已保存,但重新加载失败")
|
|
150
|
+
|
|
151
|
+
# --- UI Callbacks ---
|
|
152
|
+
run_btn.click(fn=on_run_click, outputs=None)
|
|
153
|
+
pause_btn.click(fn=on_pause_click, outputs=None)
|
|
154
|
+
|
|
155
|
+
select_all_btn.click(fn=lambda: batch_select(True, True, "✓ 全选成功"), outputs=None)
|
|
156
|
+
unselect_all_btn.click(fn=lambda: batch_select(False, False, "✓ 清空成功"), outputs=None)
|
|
157
|
+
select_produce_only_btn.click(fn=lambda: batch_select(False, True, "✓ 只选培育成功"), outputs=None)
|
|
158
|
+
unselect_produce_only_btn.click(fn=lambda: batch_select(True, False, "✓ 只不选培育成功"), outputs=None)
|
|
159
|
+
|
|
160
|
+
# .input is used to only trigger on user interaction
|
|
161
|
+
purchase_quick.input(fn=lambda x: update_and_save_quick_setting('purchase.enabled', x, '商店'), inputs=[purchase_quick])
|
|
162
|
+
assignment_quick.input(fn=lambda x: update_and_save_quick_setting('assignment.enabled', x, '工作'), inputs=[assignment_quick])
|
|
163
|
+
contest_quick.input(fn=lambda x: update_and_save_quick_setting('contest.enabled', x, '竞赛'), inputs=[contest_quick])
|
|
164
|
+
produce_quick.input(fn=lambda x: update_and_save_quick_setting('produce.enabled', x, '培育'), inputs=[produce_quick])
|
|
165
|
+
mission_reward_quick.input(fn=lambda x: update_and_save_quick_setting('mission_reward.enabled', x, '任务奖励'), inputs=[mission_reward_quick])
|
|
166
|
+
club_reward_quick.input(fn=lambda x: update_and_save_quick_setting('club_reward.enabled', x, '社团奖励'), inputs=[club_reward_quick])
|
|
167
|
+
activity_funds_quick.input(fn=lambda x: update_and_save_quick_setting('activity_funds.enabled', x, '活动费'), inputs=[activity_funds_quick])
|
|
168
|
+
presents_quick.input(fn=lambda x: update_and_save_quick_setting('presents.enabled', x, '礼物'), inputs=[presents_quick])
|
|
169
|
+
capsule_toys_quick.input(fn=lambda x: update_and_save_quick_setting('capsule_toys.enabled', x, '扭蛋'), inputs=[capsule_toys_quick])
|
|
170
|
+
upgrade_support_card_quick.input(fn=lambda x: update_and_save_quick_setting('upgrade_support_card.enabled', x, '支援卡升级'), inputs=[upgrade_support_card_quick])
|
|
171
|
+
end_action_dropdown.change(fn=save_quick_end_action, inputs=[end_action_dropdown])
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import gradio as gr
|
|
2
|
+
from kaa.application.ui.facade import KaaFacade
|
|
3
|
+
from kaa.application.ui.common import GradioComponents
|
|
4
|
+
|
|
5
|
+
class TaskView:
|
|
6
|
+
def __init__(self, facade: KaaFacade, components: GradioComponents):
|
|
7
|
+
self.facade = facade
|
|
8
|
+
self.components = components
|
|
9
|
+
|
|
10
|
+
def create_ui(self):
|
|
11
|
+
"""Creates the content for the 'Task' tab for running single tasks."""
|
|
12
|
+
gr.Markdown("## 执行任务")
|
|
13
|
+
|
|
14
|
+
# Get all tasks from the facade
|
|
15
|
+
task_names = self.facade.task_service.get_all_task_names()
|
|
16
|
+
|
|
17
|
+
with gr.Row():
|
|
18
|
+
stop_all_btn = gr.Button("停止任务", variant="stop", scale=1)
|
|
19
|
+
pause_btn = gr.Button("暂停", scale=1)
|
|
20
|
+
|
|
21
|
+
task_result = gr.Markdown("")
|
|
22
|
+
|
|
23
|
+
task_buttons = []
|
|
24
|
+
for task_name in task_names:
|
|
25
|
+
with gr.Row():
|
|
26
|
+
with gr.Column(scale=1, min_width=50):
|
|
27
|
+
task_btn = gr.Button("启动", variant="primary", size="sm")
|
|
28
|
+
task_buttons.append(task_btn)
|
|
29
|
+
with gr.Column(scale=7):
|
|
30
|
+
gr.Markdown(f"### {task_name}")
|
|
31
|
+
|
|
32
|
+
def start_single_task_by_name(task_name: str):
|
|
33
|
+
"""Event handler to start a single task."""
|
|
34
|
+
try:
|
|
35
|
+
self.facade.task_service.start_single_task(task_name)
|
|
36
|
+
gr.Info(f"任务 {task_name} 开始执行")
|
|
37
|
+
except ValueError as e:
|
|
38
|
+
gr.Warning(str(e))
|
|
39
|
+
except Exception as e:
|
|
40
|
+
gr.Error(f"启动任务失败: {e}")
|
|
41
|
+
|
|
42
|
+
def stop_all_tasks():
|
|
43
|
+
"""Event handler to stop the running single task."""
|
|
44
|
+
self.facade.task_service.stop_tasks()
|
|
45
|
+
self.facade.idle_mgr.notify_on_stop()
|
|
46
|
+
|
|
47
|
+
def on_pause_click():
|
|
48
|
+
self.facade.toggle_pause()
|
|
49
|
+
|
|
50
|
+
# Bind click events
|
|
51
|
+
for i, task_name in enumerate(task_names):
|
|
52
|
+
# Use a closure/factory function to capture the correct task_name
|
|
53
|
+
def create_handler(name):
|
|
54
|
+
return lambda: start_single_task_by_name(name)
|
|
55
|
+
task_buttons[i].click(fn=create_handler(task_name), outputs=None)
|
|
56
|
+
|
|
57
|
+
stop_all_btn.click(fn=stop_all_tasks, outputs=None)
|
|
58
|
+
pause_btn.click(fn=on_pause_click, outputs=None)
|
|
59
|
+
|
|
60
|
+
# --- Timers for status updates ---
|
|
61
|
+
|
|
62
|
+
def update_task_ui_status():
|
|
63
|
+
tcs = self.facade.task_service
|
|
64
|
+
is_running = tcs.is_running_single
|
|
65
|
+
is_stopping = tcs.is_stopping
|
|
66
|
+
|
|
67
|
+
# Update buttons
|
|
68
|
+
btn_updates = {}
|
|
69
|
+
if is_running or is_stopping:
|
|
70
|
+
btn_text = "停止中" if is_stopping else "运行中"
|
|
71
|
+
for btn in task_buttons:
|
|
72
|
+
btn_updates[btn] = gr.Button(value=btn_text, interactive=False)
|
|
73
|
+
else:
|
|
74
|
+
for btn in task_buttons:
|
|
75
|
+
btn_updates[btn] = gr.Button(value="启动", interactive=True)
|
|
76
|
+
|
|
77
|
+
# Update status message
|
|
78
|
+
status_msg = ""
|
|
79
|
+
if is_running:
|
|
80
|
+
for name, status in tcs.get_task_statuses():
|
|
81
|
+
if status == 'running':
|
|
82
|
+
status_msg = f"正在执行任务: {name}"
|
|
83
|
+
break
|
|
84
|
+
elif not tcs.run_status or not tcs.run_status.running:
|
|
85
|
+
# Task finished, find final status
|
|
86
|
+
if tcs.run_status and tcs.run_status.tasks:
|
|
87
|
+
final_status = tcs.run_status.tasks[0]
|
|
88
|
+
status_map = {'finished': '已完成', 'error': '出错', 'cancelled': '已取消'}
|
|
89
|
+
status_msg = f"任务 {final_status.task.name} {status_map.get(final_status.status, '已结束')}"
|
|
90
|
+
|
|
91
|
+
btn_updates[task_result] = gr.Markdown(value=status_msg)
|
|
92
|
+
|
|
93
|
+
# Update pause button
|
|
94
|
+
pause_status = self.facade.get_pause_button_status()
|
|
95
|
+
btn_updates[pause_btn] = gr.Button(value=pause_status['text'], interactive=pause_status['interactive'])
|
|
96
|
+
|
|
97
|
+
return btn_updates
|
|
98
|
+
|
|
99
|
+
gr.Timer(1.0).tick(
|
|
100
|
+
fn=update_task_ui_status,
|
|
101
|
+
outputs=task_buttons + [task_result, pause_btn]
|
|
102
|
+
)
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import gradio as gr
|
|
2
|
+
import logging
|
|
3
|
+
from typing import Generator, Tuple
|
|
4
|
+
from kaa.application.ui.facade import KaaFacade
|
|
5
|
+
from kaa.application.ui.common import GradioComponents
|
|
6
|
+
from kaa.errors import UpdateServiceError, UpdateFetchListError
|
|
7
|
+
|
|
8
|
+
logger = logging.getLogger(__name__)
|
|
9
|
+
|
|
10
|
+
class UpdateView:
|
|
11
|
+
def __init__(self, facade: KaaFacade, components: GradioComponents):
|
|
12
|
+
self.facade = facade
|
|
13
|
+
self.components = components
|
|
14
|
+
|
|
15
|
+
def create_ui(self):
|
|
16
|
+
"""Creates the content for the 'Update' tab."""
|
|
17
|
+
with gr.Tab("更新"):
|
|
18
|
+
gr.Markdown("## 版本管理")
|
|
19
|
+
|
|
20
|
+
with gr.Accordion("更新日志", open=False):
|
|
21
|
+
try:
|
|
22
|
+
from kaa.metadata import WHATS_NEW
|
|
23
|
+
gr.Markdown(WHATS_NEW)
|
|
24
|
+
except ImportError:
|
|
25
|
+
gr.Markdown("更新日志不可用")
|
|
26
|
+
|
|
27
|
+
load_info_btn = gr.Button("载入信息", variant="primary")
|
|
28
|
+
status_text = gr.Markdown("")
|
|
29
|
+
version_dropdown = gr.Dropdown(
|
|
30
|
+
label="选择要安装的版本",
|
|
31
|
+
choices=[],
|
|
32
|
+
value=None,
|
|
33
|
+
visible=False,
|
|
34
|
+
interactive=True
|
|
35
|
+
)
|
|
36
|
+
install_selected_btn = gr.Button("安装选定版本", visible=False)
|
|
37
|
+
|
|
38
|
+
# Store components for later access
|
|
39
|
+
self.components.update_status_text = status_text
|
|
40
|
+
self.components.update_version_dropdown = version_dropdown
|
|
41
|
+
self.components.update_install_btn = install_selected_btn
|
|
42
|
+
|
|
43
|
+
def on_load_info():
|
|
44
|
+
"""使用 UpdateService 加载版本信息。"""
|
|
45
|
+
yield (
|
|
46
|
+
"正在载入版本信息...",
|
|
47
|
+
gr.Button(value="载入中...", interactive=False),
|
|
48
|
+
gr.Dropdown(visible=False),
|
|
49
|
+
gr.Button(visible=False)
|
|
50
|
+
)
|
|
51
|
+
try:
|
|
52
|
+
versions_data = self.facade.update_service.list_remote_versions()
|
|
53
|
+
except UpdateFetchListError as e:
|
|
54
|
+
gr.Error(str(e))
|
|
55
|
+
yield (
|
|
56
|
+
str(e),
|
|
57
|
+
gr.Button(value="载入信息", interactive=True),
|
|
58
|
+
gr.Dropdown(visible=False),
|
|
59
|
+
gr.Button(visible=False)
|
|
60
|
+
)
|
|
61
|
+
return
|
|
62
|
+
|
|
63
|
+
status_info = [
|
|
64
|
+
f"**当前安装版本:** {versions_data.installed_version or '未知'}",
|
|
65
|
+
f"**最新版本:** {versions_data.latest or '未知'}",
|
|
66
|
+
]
|
|
67
|
+
if versions_data.launcher_version:
|
|
68
|
+
if versions_data.launcher_version == "0.4.x":
|
|
69
|
+
status_info.append("**启动器版本:** < v0.5.0 (旧版本)")
|
|
70
|
+
else:
|
|
71
|
+
status_info.append(f"**启动器版本:** v{versions_data.launcher_version}")
|
|
72
|
+
else:
|
|
73
|
+
status_info.append("**启动器版本:** 未知")
|
|
74
|
+
|
|
75
|
+
status_info.append(f"**找到 {len(versions_data.versions)} 个可用版本**")
|
|
76
|
+
status_message = "\n\n".join(status_info)
|
|
77
|
+
|
|
78
|
+
yield (
|
|
79
|
+
status_message,
|
|
80
|
+
gr.Button(value="载入信息", interactive=True),
|
|
81
|
+
gr.Dropdown(choices=versions_data.versions, value=versions_data.versions[0] if versions_data.versions else None, visible=True),
|
|
82
|
+
gr.Button(visible=True)
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
def on_install_selected(selected_version: str):
|
|
86
|
+
"""使用 UpdateService 安装所选版本。"""
|
|
87
|
+
if not selected_version:
|
|
88
|
+
gr.Warning("请先选择一个版本。")
|
|
89
|
+
return
|
|
90
|
+
|
|
91
|
+
try:
|
|
92
|
+
self.facade.update_service.install_version(selected_version)
|
|
93
|
+
gr.Info(f"正在启动器中安装版本 {selected_version},程序将自动重启...")
|
|
94
|
+
except UpdateServiceError as e:
|
|
95
|
+
gr.Error(str(e))
|
|
96
|
+
|
|
97
|
+
load_info_btn.click(
|
|
98
|
+
fn=on_load_info,
|
|
99
|
+
outputs=[status_text, load_info_btn, version_dropdown, install_selected_btn]
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
install_selected_btn.click(
|
|
103
|
+
fn=on_install_selected,
|
|
104
|
+
inputs=[version_dropdown],
|
|
105
|
+
outputs=[]
|
|
106
|
+
)
|
kaa/config/schema.py
CHANGED
|
@@ -3,6 +3,7 @@ from pydantic import BaseModel, ConfigDict
|
|
|
3
3
|
|
|
4
4
|
from kotonebot import config
|
|
5
5
|
from kaa.config.produce import ProduceSolution, ProduceSolutionManager
|
|
6
|
+
from kaa.errors import NoProduceSolutionSelectedError
|
|
6
7
|
from .const import (
|
|
7
8
|
ConfigEnum,
|
|
8
9
|
Priority,
|
|
@@ -30,6 +31,8 @@ class PurchaseConfig(ConfigBaseModel):
|
|
|
30
31
|
"""是否启用AP购买"""
|
|
31
32
|
ap_items: Sequence[Literal[0, 1, 2, 3]] = []
|
|
32
33
|
"""AP商店要购买的物品"""
|
|
34
|
+
weekly_enabled: bool = False
|
|
35
|
+
"""是否启用周免费礼包购买"""
|
|
33
36
|
|
|
34
37
|
|
|
35
38
|
class ActivityFundsConfig(ConfigBaseModel):
|
|
@@ -77,6 +80,16 @@ class ProduceConfig(ConfigBaseModel):
|
|
|
77
80
|
"""培育的次数。"""
|
|
78
81
|
produce_timeout_cd: int = 60
|
|
79
82
|
"""推荐卡检测用时上限;若超时,则随机选择卡片打出。单位为秒,最少为20sec,DMM用户可以设置为30sec"""
|
|
83
|
+
interrupt_timeout: int = 90
|
|
84
|
+
"""检测超时时间。单位秒。"""
|
|
85
|
+
enable_fever_month: Literal['on', 'off', 'ignore'] = 'ignore'
|
|
86
|
+
"""
|
|
87
|
+
是否自动启用强化月间。
|
|
88
|
+
|
|
89
|
+
* on: 自动启用
|
|
90
|
+
* off: 自动禁用
|
|
91
|
+
* ignore: 不改变当前状态
|
|
92
|
+
"""
|
|
80
93
|
|
|
81
94
|
class MissionRewardConfig(ConfigBaseModel):
|
|
82
95
|
enabled: bool = False
|
|
@@ -125,21 +138,24 @@ class StartGameConfig(ConfigBaseModel):
|
|
|
125
138
|
|
|
126
139
|
kuyo_package_name: str = 'org.kuyo.game'
|
|
127
140
|
"""Kuyo包名"""
|
|
128
|
-
|
|
141
|
+
|
|
129
142
|
disable_gakumas_localify: bool = False
|
|
130
143
|
"""
|
|
131
144
|
自动检测并禁用 Gakumas Localify 汉化插件。
|
|
132
|
-
|
|
145
|
+
|
|
133
146
|
(目前仅对 DMM 版有效。)
|
|
134
147
|
"""
|
|
135
|
-
|
|
148
|
+
|
|
136
149
|
dmm_game_path: str | None = None
|
|
137
150
|
"""
|
|
138
151
|
DMM 版游戏路径。若不填写,会自动检测。
|
|
139
|
-
|
|
152
|
+
|
|
140
153
|
例:`F:\\Games\\gakumas\\gakumas.exe`
|
|
141
154
|
"""
|
|
142
155
|
|
|
156
|
+
dmm_bypass: bool = False
|
|
157
|
+
"""绕过 DMM 启动器直接启动游戏(实验性)"""
|
|
158
|
+
|
|
143
159
|
class EndGameConfig(ConfigBaseModel):
|
|
144
160
|
exit_kaa: bool = False
|
|
145
161
|
"""退出 kaa"""
|
|
@@ -157,7 +173,7 @@ class EndGameConfig(ConfigBaseModel):
|
|
|
157
173
|
"""
|
|
158
174
|
恢复 Gakumas Localify 汉化插件状态至启动前。通常与
|
|
159
175
|
`disable_gakumas_localify` 配对使用。
|
|
160
|
-
|
|
176
|
+
|
|
161
177
|
(目前仅对 DMM 版有效。)
|
|
162
178
|
"""
|
|
163
179
|
|
|
@@ -188,6 +204,10 @@ class MiscConfig(ConfigBaseModel):
|
|
|
188
204
|
* release: 只使用稳定版。
|
|
189
205
|
* beta: 包含预发布版本(如 alpha/beta/rc)。
|
|
190
206
|
"""
|
|
207
|
+
log_level: Literal['debug', 'verbose'] = 'debug'
|
|
208
|
+
"""
|
|
209
|
+
日志等级。
|
|
210
|
+
"""
|
|
191
211
|
|
|
192
212
|
class IdleModeConfig(ConfigBaseModel):
|
|
193
213
|
enabled: bool = False
|
|
@@ -253,6 +273,6 @@ def produce_solution() -> ProduceSolution:
|
|
|
253
273
|
"""获取当前培育方案"""
|
|
254
274
|
id = conf().produce.selected_solution_id
|
|
255
275
|
if id is None:
|
|
256
|
-
raise
|
|
276
|
+
raise NoProduceSolutionSelectedError()
|
|
257
277
|
# TODO: 这里需要缓存,不能每次都从磁盘读取
|
|
258
278
|
return ProduceSolutionManager().read(id)
|
kaa/errors.py
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import os
|
|
2
|
+
import platform
|
|
2
3
|
from kotonebot.errors import UserFriendlyError
|
|
3
4
|
|
|
4
5
|
|
|
@@ -19,6 +20,58 @@ class KaaUserFriendlyError(UserFriendlyError, KaaError):
|
|
|
19
20
|
def __str__(self):
|
|
20
21
|
return f'【发生错误】{self.message}。访问 {self.help_link} 以获取更多帮助。'
|
|
21
22
|
|
|
23
|
+
class ServiceError(KaaUserFriendlyError):
|
|
24
|
+
"""Base class for service-related errors."""
|
|
25
|
+
def __init__(self, message: str, help_link: str):
|
|
26
|
+
super().__init__(message, help_link)
|
|
27
|
+
|
|
28
|
+
class UpdateServiceError(ServiceError):
|
|
29
|
+
"""Base class for update service errors."""
|
|
30
|
+
pass
|
|
31
|
+
|
|
32
|
+
class UpdateFetchListError(UpdateServiceError):
|
|
33
|
+
def __init__(self, reason: str):
|
|
34
|
+
super().__init__(
|
|
35
|
+
f'Failed to fetch version list: {reason}',
|
|
36
|
+
'' # TODO
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
class CompatibilityError(UpdateServiceError):
|
|
40
|
+
def __init__(self, launcher_version: str, target_version: str):
|
|
41
|
+
super().__init__(
|
|
42
|
+
f"❌ 版本兼容性错误\n\n"
|
|
43
|
+
f"启动器版本: {launcher_version}\n"
|
|
44
|
+
f"要安装的版本: {target_version}\n\n"
|
|
45
|
+
f"v2025.9b1 及以上版本需要**启动器 v0.5.0*** 或更高版本支持。\n"
|
|
46
|
+
f"请先升级启动器到 v0.5.0 以上版本。",
|
|
47
|
+
''
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
class UpdateInstallError(UpdateServiceError):
|
|
51
|
+
def __init__(self, reason: str):
|
|
52
|
+
super().__init__(
|
|
53
|
+
f'Failed to start installation process: {reason}',
|
|
54
|
+
'https://www.kdocs.cn/l/cetCY8mGKHLj?linkname=some-link' # TODO
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
class FeedbackServiceError(ServiceError):
|
|
58
|
+
"""Base class for feedback service errors."""
|
|
59
|
+
pass
|
|
60
|
+
|
|
61
|
+
class ReportCreationError(FeedbackServiceError):
|
|
62
|
+
def __init__(self, reason: str):
|
|
63
|
+
super().__init__(
|
|
64
|
+
f'Failed to create bug report: {reason}',
|
|
65
|
+
'https://www.kdocs.cn/l/cetCY8mGKHLj?linkname=some-link' # TODO
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
class UploadError(FeedbackServiceError):
|
|
69
|
+
def __init__(self, reason: str):
|
|
70
|
+
super().__init__(
|
|
71
|
+
f'Failed to upload bug report: {reason}',
|
|
72
|
+
'https://www.kdocs.cn/l/cetCY8mGKHLj?linkname=some-link' # TODO
|
|
73
|
+
)
|
|
74
|
+
|
|
22
75
|
class ProduceSolutionNotFoundError(KaaUserFriendlyError):
|
|
23
76
|
def __init__(self, solution_id: str):
|
|
24
77
|
self.solution_id = solution_id
|
|
@@ -63,4 +116,26 @@ class GameUpdateNeededError(KaaUserFriendlyError):
|
|
|
63
116
|
super().__init__(
|
|
64
117
|
'游戏本体需要更新。kaa 暂不支持自动更新,请前往 Play Store 手动更新游戏。',
|
|
65
118
|
'https://www.baidu.com/s?wd=%E5%BF%AB%E5%8E%BB%E6%9B%B4%E6%96%B0%E6%B8%B8%E6%88%8F%E5%95%8A%EF%BC%8C%E8%BF%98%E7%82%B9%E4%BB%80%E4%B9%88%E6%89%93%E5%BC%80%E5%B8%AE%E5%8A%A9'
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
class NoProduceSolutionSelectedError(KaaUserFriendlyError):
|
|
122
|
+
def __init__(self):
|
|
123
|
+
super().__init__(
|
|
124
|
+
'未选择培育方案。请前往「设置」,在「当前使用的培育方案」选择一个培育方案后再重新运行。',
|
|
125
|
+
'https://www.kdocs.cn/l/cetCY8mGKHLj?linkname=LasxpznR6b'
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
class DmmGameLaunchError(KaaUserFriendlyError):
|
|
129
|
+
def __init__(self, reason: str):
|
|
130
|
+
self.reason = reason
|
|
131
|
+
super().__init__(
|
|
132
|
+
f'绕过 DMM 启动器失败,原因:{reason}',
|
|
133
|
+
'https://www.kdocs.cn/l/cetCY8mGKHLj?linkname=pSw7QcH1Kx'
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
class WindowsOnlyError(KaaUserFriendlyError):
|
|
137
|
+
def __init__(self, feature_name: str):
|
|
138
|
+
super().__init__(
|
|
139
|
+
f'此功能({feature_name})仅在 Windows 上可用。当前系统为 {platform.system()}。请不要使用此功能,或在 Windows 上运行 kaa。',
|
|
140
|
+
'https://www.kdocs.cn/l/cetCY8mGKHLj?linkname=LbvACPfiCw'
|
|
66
141
|
)
|
kaa/main/dmm_host.py
CHANGED
|
@@ -1,60 +1,60 @@
|
|
|
1
|
-
from typing_extensions import override
|
|
2
|
-
|
|
3
|
-
from kotonebot.client import Device
|
|
4
|
-
from kotonebot.client.host import HostProtocol, Instance
|
|
5
|
-
from kotonebot.client.host.windows_common import WindowsRecipes, WindowsHostConfigs, CommonWindowsCreateDeviceMixin
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
DmmHostConfigs = WindowsHostConfigs
|
|
9
|
-
DmmRecipes = WindowsRecipes
|
|
10
|
-
|
|
11
|
-
# TODO: 可能应该把 start_game 和 end_game 里对启停的操作移动到这里来
|
|
12
|
-
class DmmInstance(CommonWindowsCreateDeviceMixin, Instance[DmmHostConfigs]):
|
|
13
|
-
def __init__(self):
|
|
14
|
-
super().__init__('dmm', 'gakumas')
|
|
15
|
-
|
|
16
|
-
@override
|
|
17
|
-
def refresh(self):
|
|
18
|
-
raise NotImplementedError()
|
|
19
|
-
|
|
20
|
-
@override
|
|
21
|
-
def start(self):
|
|
22
|
-
raise NotImplementedError()
|
|
23
|
-
|
|
24
|
-
@override
|
|
25
|
-
def stop(self):
|
|
26
|
-
raise NotImplementedError()
|
|
27
|
-
|
|
28
|
-
@override
|
|
29
|
-
def running(self) -> bool:
|
|
30
|
-
raise NotImplementedError()
|
|
31
|
-
|
|
32
|
-
@override
|
|
33
|
-
def wait_available(self, timeout: float = 180):
|
|
34
|
-
raise NotImplementedError()
|
|
35
|
-
|
|
36
|
-
@override
|
|
37
|
-
def create_device(self, impl: DmmRecipes, host_config: DmmHostConfigs) -> Device:
|
|
38
|
-
"""为 DMM 实例创建 Device。"""
|
|
39
|
-
return super().create_device(impl, host_config)
|
|
40
|
-
|
|
41
|
-
class DmmHost(HostProtocol[DmmRecipes]):
|
|
42
|
-
instance = DmmInstance()
|
|
43
|
-
"""DmmInstance 单例。"""
|
|
44
|
-
|
|
45
|
-
@staticmethod
|
|
46
|
-
def installed() -> bool:
|
|
47
|
-
# TODO: 应该检查 DMM 和 gamkumas 的安装情况
|
|
48
|
-
raise NotImplementedError()
|
|
49
|
-
|
|
50
|
-
@staticmethod
|
|
51
|
-
def list() -> list[Instance]:
|
|
52
|
-
raise NotImplementedError()
|
|
53
|
-
|
|
54
|
-
@staticmethod
|
|
55
|
-
def query(*, id: str) -> Instance | None:
|
|
56
|
-
raise NotImplementedError()
|
|
57
|
-
|
|
58
|
-
@staticmethod
|
|
59
|
-
def recipes() -> 'list[DmmRecipes]':
|
|
60
|
-
return ['windows', 'remote_windows']
|
|
1
|
+
from typing_extensions import override
|
|
2
|
+
|
|
3
|
+
from kotonebot.client import Device
|
|
4
|
+
from kotonebot.client.host import HostProtocol, Instance
|
|
5
|
+
from kotonebot.client.host.windows_common import WindowsRecipes, WindowsHostConfigs, CommonWindowsCreateDeviceMixin
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
DmmHostConfigs = WindowsHostConfigs
|
|
9
|
+
DmmRecipes = WindowsRecipes
|
|
10
|
+
|
|
11
|
+
# TODO: 可能应该把 start_game 和 end_game 里对启停的操作移动到这里来
|
|
12
|
+
class DmmInstance(CommonWindowsCreateDeviceMixin, Instance[DmmHostConfigs]):
|
|
13
|
+
def __init__(self):
|
|
14
|
+
super().__init__('dmm', 'gakumas')
|
|
15
|
+
|
|
16
|
+
@override
|
|
17
|
+
def refresh(self):
|
|
18
|
+
raise NotImplementedError()
|
|
19
|
+
|
|
20
|
+
@override
|
|
21
|
+
def start(self):
|
|
22
|
+
raise NotImplementedError()
|
|
23
|
+
|
|
24
|
+
@override
|
|
25
|
+
def stop(self):
|
|
26
|
+
raise NotImplementedError()
|
|
27
|
+
|
|
28
|
+
@override
|
|
29
|
+
def running(self) -> bool:
|
|
30
|
+
raise NotImplementedError()
|
|
31
|
+
|
|
32
|
+
@override
|
|
33
|
+
def wait_available(self, timeout: float = 180):
|
|
34
|
+
raise NotImplementedError()
|
|
35
|
+
|
|
36
|
+
@override
|
|
37
|
+
def create_device(self, impl: DmmRecipes, host_config: DmmHostConfigs) -> Device:
|
|
38
|
+
"""为 DMM 实例创建 Device。"""
|
|
39
|
+
return super().create_device(impl, host_config)
|
|
40
|
+
|
|
41
|
+
class DmmHost(HostProtocol[DmmRecipes]):
|
|
42
|
+
instance = DmmInstance()
|
|
43
|
+
"""DmmInstance 单例。"""
|
|
44
|
+
|
|
45
|
+
@staticmethod
|
|
46
|
+
def installed() -> bool:
|
|
47
|
+
# TODO: 应该检查 DMM 和 gamkumas 的安装情况
|
|
48
|
+
raise NotImplementedError()
|
|
49
|
+
|
|
50
|
+
@staticmethod
|
|
51
|
+
def list() -> list[Instance]:
|
|
52
|
+
raise NotImplementedError()
|
|
53
|
+
|
|
54
|
+
@staticmethod
|
|
55
|
+
def query(*, id: str) -> Instance | None:
|
|
56
|
+
raise NotImplementedError()
|
|
57
|
+
|
|
58
|
+
@staticmethod
|
|
59
|
+
def recipes() -> 'list[DmmRecipes]':
|
|
60
|
+
return ['windows', 'remote_windows']
|