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.
Files changed (354) hide show
  1. kaa/__init__.py +0 -0
  2. kaa/application/__init__.py +0 -0
  3. kaa/application/core/misc_core.py +4 -1
  4. kaa/application/services/__init__.py +0 -0
  5. kaa/application/services/config_service.py +101 -0
  6. kaa/application/services/feedback_service.py +121 -0
  7. kaa/application/services/produce_solution_service.py +83 -0
  8. kaa/application/services/task_service.py +145 -0
  9. kaa/application/services/update_service.py +208 -0
  10. kaa/application/ui/__init__.py +0 -0
  11. kaa/application/ui/common.py +123 -0
  12. kaa/application/ui/components/alert.py +251 -0
  13. kaa/application/ui/components/alert.pyi +257 -0
  14. kaa/application/ui/components/categorized_select.pyi +697 -0
  15. kaa/application/ui/facade.py +189 -0
  16. kaa/application/ui/gradio_view.py +135 -0
  17. kaa/application/ui/views/__init__.py +0 -0
  18. kaa/application/ui/views/feedback_view.py +65 -0
  19. kaa/application/ui/views/produce_view.py +251 -0
  20. kaa/application/ui/views/settings_view.py +581 -0
  21. kaa/application/ui/views/status_view.py +171 -0
  22. kaa/application/ui/views/task_view.py +102 -0
  23. kaa/application/ui/views/update_view.py +106 -0
  24. kaa/config/schema.py +26 -6
  25. kaa/errors.py +75 -0
  26. kaa/main/dmm_host.py +60 -60
  27. kaa/main/gr.py +60 -3115
  28. kaa/main/kaa.py +11 -3
  29. kaa/metadata.py +10 -0
  30. kaa/resources/__pycache__/__init__.cpython-310.pyc +0 -0
  31. kaa/resources/game.db +0 -0
  32. kaa/resources/game_ver.txt +0 -0
  33. kaa/resources/idol_cards/i_card-skin-amao-3-014_1.png +0 -0
  34. kaa/resources/idol_cards/i_card-skin-amao-3-015_0.png +0 -0
  35. kaa/resources/idol_cards/i_card-skin-amao-3-015_1.png +0 -0
  36. kaa/resources/idol_cards/i_card-skin-atbm-1-000_0.png +0 -0
  37. kaa/resources/idol_cards/i_card-skin-atbm-1-000_1.png +0 -0
  38. kaa/resources/idol_cards/i_card-skin-atbm-2-000_0.png +0 -0
  39. kaa/resources/idol_cards/i_card-skin-atbm-2-000_1.png +0 -0
  40. kaa/resources/idol_cards/i_card-skin-atbm-3-000_0.png +0 -0
  41. kaa/resources/idol_cards/i_card-skin-atbm-3-000_1.png +0 -0
  42. kaa/resources/idol_cards/i_card-skin-fktn-3-016_0.png +0 -0
  43. kaa/resources/idol_cards/i_card-skin-fktn-3-016_1.png +0 -0
  44. kaa/resources/idol_cards/i_card-skin-hmsz-3-003_0.png +0 -0
  45. kaa/resources/idol_cards/i_card-skin-hmsz-3-003_1.png +0 -0
  46. kaa/resources/idol_cards/i_card-skin-hmsz-3-009_0.png +0 -0
  47. kaa/resources/idol_cards/i_card-skin-hmsz-3-009_1.png +0 -0
  48. kaa/resources/idol_cards/i_card-skin-hmsz-3-013_0.png +0 -0
  49. kaa/resources/idol_cards/i_card-skin-hmsz-3-013_1.png +0 -0
  50. kaa/resources/idol_cards/i_card-skin-hrnm-3-015_0.png +0 -0
  51. kaa/resources/idol_cards/i_card-skin-hrnm-3-015_1.png +0 -0
  52. kaa/resources/idol_cards/i_card-skin-hski-3-015_0.png +0 -0
  53. kaa/resources/idol_cards/i_card-skin-hski-3-015_1.png +0 -0
  54. kaa/resources/idol_cards/i_card-skin-hume-3-009_0.png +0 -0
  55. kaa/resources/idol_cards/i_card-skin-hume-3-009_1.png +0 -0
  56. kaa/resources/idol_cards/i_card-skin-hume-3-015_0.png +0 -0
  57. kaa/resources/idol_cards/i_card-skin-hume-3-015_1.png +0 -0
  58. kaa/resources/idol_cards/i_card-skin-jsna-3-009_0.png +0 -0
  59. kaa/resources/idol_cards/i_card-skin-jsna-3-009_1.png +0 -0
  60. kaa/resources/idol_cards/i_card-skin-jsna-3-014_0.png +0 -0
  61. kaa/resources/idol_cards/i_card-skin-jsna-3-014_1.png +0 -0
  62. kaa/resources/idol_cards/i_card-skin-kcna-3-014_0.png +0 -0
  63. kaa/resources/idol_cards/i_card-skin-kcna-3-014_1.png +0 -0
  64. kaa/resources/idol_cards/i_card-skin-kcna-3-015_0.png +0 -0
  65. kaa/resources/idol_cards/i_card-skin-kcna-3-015_1.png +0 -0
  66. kaa/resources/idol_cards/i_card-skin-kllj-3-014_0.png +0 -0
  67. kaa/resources/idol_cards/i_card-skin-kllj-3-014_1.png +0 -0
  68. kaa/resources/idol_cards/i_card-skin-shro-3-015_0.png +0 -0
  69. kaa/resources/idol_cards/i_card-skin-shro-3-015_1.png +0 -0
  70. kaa/resources/idol_cards/i_card-skin-ssmk-3-015_0.png +0 -0
  71. kaa/resources/idol_cards/i_card-skin-ssmk-3-015_1.png +0 -0
  72. kaa/resources/idol_cards/i_card-skin-ttmr-3-015_0.png +0 -0
  73. kaa/resources/idol_cards/i_card-skin-ttmr-3-015_1.png +0 -0
  74. kaa/sprites/0cdd57aa-9bdd-4c83-9565-de7c229b34e3.png +0 -0
  75. kaa/sprites/16f04ca1-05a3-49c7-88ae-a0d02c1ec2ec.png +0 -0
  76. kaa/sprites/20ca6d42-c19e-4c3e-b82c-f6642bbe5069.png +0 -0
  77. kaa/sprites/276c0178-65af-4b69-a3c3-d04253b9ed91.png +0 -0
  78. kaa/sprites/32de6ba0-859f-4f40-a57e-92bed913e3a7.png +0 -0
  79. kaa/sprites/38613745-1cf2-4bf1-9f58-0474b1e46895.png +0 -0
  80. kaa/sprites/41904062-e218-4b28-972a-b5cfcd058d2c.png +0 -0
  81. kaa/sprites/44097699-487f-4932-846a-095a427f4ed8.png +0 -0
  82. kaa/sprites/459f532f-115c-4527-a897-affa7ddcbd76.png +0 -0
  83. kaa/sprites/46cb87f6-26f7-45f0-b10c-6491f115077e.png +0 -0
  84. kaa/sprites/4b02f8d4-7847-47a5-8f01-7ab5123709e5.png +0 -0
  85. kaa/sprites/4b7426e9-395a-410c-bb99-c6f0a7b81208.png +0 -0
  86. kaa/sprites/4c243ed4-9ac2-42ba-89c6-946ffef84120.png +0 -0
  87. kaa/sprites/527c3803-1ddd-4f6b-a896-815d3c2e4caa.png +0 -0
  88. kaa/sprites/54d67100-70c7-4a00-afaa-a80771d34893.png +0 -0
  89. kaa/sprites/5588396d-dd38-4ef1-8c37-3041a750b1cc.png +0 -0
  90. kaa/sprites/5933f6ab-7af4-4731-aac8-d95939a3fbbf.png +0 -0
  91. kaa/sprites/5c49d3b3-656e-4c8c-ae1a-9b0209b9dcc3.png +0 -0
  92. kaa/sprites/5c735cc5-7801-44e9-a8f1-2d44df4fa919.png +0 -0
  93. kaa/sprites/678073ec-6700-4d94-af41-b392af11201b.png +0 -0
  94. kaa/sprites/6a27faad-df3b-49d9-a20f-64ae8e8f9e22.png +0 -0
  95. kaa/sprites/6b63fca9-a1ec-490e-96e9-fc0beeeb8851.png +0 -0
  96. kaa/sprites/6baaecdd-2817-4ba3-a2da-346ef9ef92fd.png +0 -0
  97. kaa/sprites/6c82d28f-913c-4444-baa6-2e37c7e24bc6.png +0 -0
  98. kaa/sprites/6d302c9d-72cd-49b5-bb11-c39140ffbdd1.png +0 -0
  99. kaa/sprites/6e603eb6-2336-46d2-ad01-2ba2fc3d4cbd.png +0 -0
  100. kaa/sprites/7156a1b5-cdd7-446e-9caf-d9f6b313ef4d.png +0 -0
  101. kaa/sprites/7469d458-d308-4469-8bf1-b63e1ddc6a3c.png +0 -0
  102. kaa/sprites/78868e34-1c2a-40ee-b08c-c89e6a3aea54.png +0 -0
  103. kaa/sprites/7c8e37b7-173f-4c03-8f11-bbd47f2a02c2.png +0 -0
  104. kaa/sprites/7ce3a2d5-efa7-4091-b012-f2870d9df422.png +0 -0
  105. kaa/sprites/7db2d761-ab44-4b3b-85aa-9b9758f97d5d.png +0 -0
  106. kaa/sprites/7ddaa9db-2287-43ba-8531-065e618ac8ef.png +0 -0
  107. kaa/sprites/7def2661-0847-4459-88c6-5270c2e8a32c.png +0 -0
  108. kaa/sprites/821c86c1-bc35-40bc-95db-f66935a92299.png +0 -0
  109. kaa/sprites/8448237d-2db5-49ca-8d55-9fc0e56639a7.png +0 -0
  110. kaa/sprites/89663a2f-c6d3-4bb7-9935-a54d11d0a382.png +0 -0
  111. kaa/sprites/8a312cf5-c670-4a52-a03b-fe55e78f8f07.png +0 -0
  112. kaa/sprites/8b6a1eed-341d-4be1-b0ae-9adc52ed4543.png +0 -0
  113. kaa/sprites/8e024c75-c872-4e18-bb80-0c5894612815.png +0 -0
  114. kaa/sprites/92f7ef0b-7931-4cd3-afda-c553232eb443.png +0 -0
  115. kaa/sprites/9803a197-d873-43cc-9656-d63513e92fad.png +0 -0
  116. kaa/sprites/9934f05f-ee5f-4131-b08d-aa61d5f3505a.png +0 -0
  117. kaa/sprites/993f2140-77be-4fe2-8e11-f71c4531bc9a.png +0 -0
  118. kaa/sprites/9a8bfa87-0e37-4d54-888f-b79f8778d232.png +0 -0
  119. kaa/sprites/9b7eaa4c-2b67-4426-80da-b7538a87ed96.png +0 -0
  120. kaa/sprites/9bc6607d-ce44-467e-a5f4-b3cf30210c13.png +0 -0
  121. kaa/sprites/9db5de82-8fba-4b69-8faf-ffe7fcea32f8.png +0 -0
  122. kaa/sprites/__pycache__/__init__.cpython-310.pyc +0 -0
  123. kaa/sprites/a1251011-00a9-402b-82da-1d2744db26cf.png +0 -0
  124. kaa/sprites/a31e08c1-d3c3-4a99-a882-4a10de9ba815.png +0 -0
  125. kaa/sprites/a408adaa-bfab-4aaf-acf7-08a4a3ebdd4c.png +0 -0
  126. kaa/sprites/a408cdfd-e394-4ada-9f0e-5878e41b8e52.png +0 -0
  127. kaa/sprites/a4723b5b-2466-4ea4-b7ef-4185bb4dda74.png +0 -0
  128. kaa/sprites/a5ba613c-46f4-4442-88e1-fbda4dd65a55.png +0 -0
  129. kaa/sprites/a88e3da2-98d3-4a64-b7ac-040847028a83.png +0 -0
  130. kaa/sprites/a9868db0-b355-470e-9bbe-033c5efa4b5e.png +0 -0
  131. kaa/sprites/a9f020e9-0e4b-4ddc-b8b8-386009578c15.png +0 -0
  132. kaa/sprites/aa369159-cc3b-40f2-9fca-bca5b579cf97.png +0 -0
  133. kaa/sprites/aad1ac7d-cfa1-4459-9d46-d39c080bd78e.png +0 -0
  134. kaa/sprites/ab9e39ae-0856-4254-a6b6-585e82f8bf3b.png +0 -0
  135. kaa/sprites/ae4742aa-acda-442d-bf73-b3fe7b66e85c.png +0 -0
  136. kaa/sprites/aff3d8ac-d648-434c-9adb-6c1a10aa04b9.png +0 -0
  137. kaa/sprites/affc5006-4b67-4490-9fa7-557a7fecb133.png +0 -0
  138. kaa/sprites/b002896d-5093-48e5-9e01-d18bfb240961.png +0 -0
  139. kaa/sprites/b00b5890-3743-4064-8311-c5e35b3afbe6.png +0 -0
  140. kaa/sprites/b26ac4ff-42a0-45aa-b818-7d7603b52f12.png +0 -0
  141. kaa/sprites/b2a04604-15d4-4ff6-86f7-0823e642103f.png +0 -0
  142. kaa/sprites/b33bb89c-cabb-4fe0-822f-d911e8b42f82.png +0 -0
  143. kaa/sprites/b5584de5-650e-4fde-b743-ccbd02eab196.png +0 -0
  144. kaa/sprites/b5f80604-d7d3-49e0-9934-58f75c393ffb.png +0 -0
  145. kaa/sprites/b70b958a-9480-4b9b-86a4-5ea099535c36.png +0 -0
  146. kaa/sprites/b93b3c36-79a3-4c1a-944a-20fe6a88c46d.png +0 -0
  147. kaa/sprites/ba7676fe-4982-4e92-822d-9c1a623420ac.png +0 -0
  148. kaa/sprites/bb953e97-7185-4c2c-b177-48d743e90d96.png +0 -0
  149. kaa/sprites/bd176e60-3bb2-453f-b2ef-45305b7f21c1.png +0 -0
  150. kaa/sprites/c0478a52-d6c5-4029-848f-e3e22b2de858.png +0 -0
  151. kaa/sprites/c05baa1e-02c3-4d02-904f-76086edbb97f.png +0 -0
  152. kaa/sprites/c295af98-0b43-4f18-bbc3-e59d23055f1b.png +0 -0
  153. kaa/sprites/c424f4a1-d032-478d-ac82-b1127a429e52.png +0 -0
  154. kaa/sprites/c5356ad6-0f1e-42be-b090-059f33ea7cee.png +0 -0
  155. kaa/sprites/c54d4b7e-887c-4753-8a9e-6914fc408232.png +0 -0
  156. kaa/sprites/c68f1282-4d86-4b1a-b76b-dcf42f3f906b.png +0 -0
  157. kaa/sprites/c71f900b-9689-4800-89a0-e3371d33f47a.png +0 -0
  158. kaa/sprites/c7cad813-2326-4662-9f55-0a15e1dad3dc.png +0 -0
  159. kaa/sprites/c95e8a90-dd6e-4cca-b74b-85ee90dbd5c1.png +0 -0
  160. kaa/sprites/c98d6bc7-45ca-4877-8cd1-6f36d6a86a02.png +0 -0
  161. kaa/sprites/ca258eea-e69a-43c3-ad4c-ac7da0099011.png +0 -0
  162. kaa/sprites/cb8d5df6-300b-48e5-ae0b-2b4750c9c092.png +0 -0
  163. kaa/sprites/cc727107-139b-4092-bafb-4bc9787bcdfd.png +0 -0
  164. kaa/sprites/cd601176-0336-41c7-8d3f-31ddf8cf708d.png +0 -0
  165. kaa/sprites/cda022d1-7898-4006-95c5-b55eceda9d95.png +0 -0
  166. kaa/sprites/ce22506b-7410-4039-94de-dc1bdba8ac00.png +0 -0
  167. kaa/sprites/cea2d5c4-6e79-425e-9e98-7e7dbdee960b.png +0 -0
  168. kaa/sprites/cf302432-c592-4b6f-a6de-53c3e1bef23e.png +0 -0
  169. kaa/sprites/d0d9f650-bb30-4743-81f3-cd7ea8211d5c.png +0 -0
  170. kaa/sprites/d14a1c6c-339a-4dfe-9078-950d3518bc3b.png +0 -0
  171. kaa/sprites/d277a9c3-2b2c-42fc-9fbb-a836413c8cf4.png +0 -0
  172. kaa/sprites/d50d4438-65bc-4849-9a11-7e8b796e1b9d.png +0 -0
  173. kaa/sprites/d5407f49-fecc-404e-915a-22c9fa16a79a.png +0 -0
  174. kaa/sprites/d73e9e03-b910-42c0-9953-34980bff09f5.png +0 -0
  175. kaa/sprites/d8485972-4e67-4190-8d95-60fd3c68b2ce.png +0 -0
  176. kaa/sprites/d963e76b-3c25-4bc7-a307-78d97728a819.png +0 -0
  177. kaa/sprites/dab08e98-9053-4e2a-9e74-cf30298fea22.png +0 -0
  178. kaa/sprites/db25f60d-4772-44f9-85dc-aba4b20cffa2.png +0 -0
  179. kaa/sprites/dcbeb7cd-cd57-4daf-b023-ff2c7ef1621a.png +0 -0
  180. kaa/sprites/dd6f31d1-510d-4425-a160-958e7e984382.png +0 -0
  181. kaa/sprites/de047f08-cef2-4b22-846e-fba2a06f8996.png +0 -0
  182. kaa/sprites/df11b01f-2ab1-4bfb-831f-bb8dae6a092b.png +0 -0
  183. kaa/sprites/e2f64c10-4db0-47c8-b23d-94802493d6fb.png +0 -0
  184. kaa/sprites/e4be69f6-6030-4fd8-8a36-fd3938d1734b.png +0 -0
  185. kaa/sprites/e4d0719b-d127-41a0-a250-492f79bf5625.png +0 -0
  186. kaa/sprites/e5196344-d61a-48ff-bc48-63f8f63c3788.png +0 -0
  187. kaa/sprites/e6f8f2a8-39e3-45e1-8a52-f2dc250bcd95.png +0 -0
  188. kaa/sprites/e70ce43b-9b3b-4aa0-8b9c-1d5cc4a1d5b0.png +0 -0
  189. kaa/sprites/e7c00f25-b15a-4403-a201-07b9b168e9f5.png +0 -0
  190. kaa/sprites/e82b9645-ee3f-4f63-922e-c1d703344baf.png +0 -0
  191. kaa/sprites/e9fad64b-e4e2-46cb-a820-b2860b38da03.png +0 -0
  192. kaa/sprites/eab111a6-80bf-45c1-9a74-b44ca76508b7.png +0 -0
  193. kaa/sprites/ec0d03db-7c66-46b7-86cc-4acaa6eba1c9.png +0 -0
  194. kaa/sprites/edd2d38d-9071-4094-8931-1a68b6ebe1b8.png +0 -0
  195. kaa/sprites/eeff3d53-5a40-44c2-9d09-8f246157c72b.png +0 -0
  196. kaa/sprites/ef0db31a-fc44-4972-af7e-21c50f0b139c.png +0 -0
  197. kaa/sprites/f1fa2fc3-c3d4-4040-90f1-7941b98dcee5.png +0 -0
  198. kaa/sprites/f31531b4-79ea-41dc-b23f-e445b818139c.png +0 -0
  199. kaa/sprites/f35e19ca-7de7-4721-af53-b5f95c5e74fe.png +0 -0
  200. kaa/sprites/f5e1e7ed-fd35-42c3-97ed-5e9214a50733.png +0 -0
  201. kaa/sprites/f7246b84-e70b-47d3-8166-90f0dc4f2bb6.png +0 -0
  202. kaa/sprites/f7e8e937-1eda-4bd3-a3cf-d306cb1973e2.png +0 -0
  203. kaa/sprites/f8babf59-d55e-40c2-a0b7-5d743ab71799.png +0 -0
  204. kaa/sprites/f9697f23-07cf-4a14-8b22-d1fc95386c16.png +0 -0
  205. kaa/sprites/fad8b65b-7d9e-49d8-9f71-6d078aa672ca.png +0 -0
  206. kaa/sprites/fb017237-bac6-4b73-9437-4518e764ef45.png +0 -0
  207. kaa/sprites/fc86085c-d708-498a-bfa6-92e1a1364c60.png +0 -0
  208. kaa/tasks/R.py +140 -128
  209. kaa/tasks/common.py +5 -0
  210. kaa/tasks/daily/contest.py +2 -1
  211. kaa/tasks/daily/purchase.py +34 -2
  212. kaa/tasks/daily/upgrade_support_card.py +12 -2
  213. kaa/tasks/produce/cards.py +5 -4
  214. kaa/tasks/produce/common.py +202 -105
  215. kaa/tasks/produce/in_purodyuusu.py +35 -17
  216. kaa/tasks/produce/non_lesson_actions.py +10 -33
  217. kaa/tasks/produce/p_drink.py +5 -1
  218. kaa/tasks/produce/produce.py +12 -1
  219. kaa/tasks/start_game.py +61 -5
  220. kaa/util/reactive.py +182 -0
  221. {ksaa-2025.9.post2.dist-info → ksaa-2025.11.dist-info}/METADATA +31 -27
  222. {ksaa-2025.9.post2.dist-info → ksaa-2025.11.dist-info}/RECORD +354 -176
  223. /kaa/sprites/{3504b421-58f2-4ca0-869e-764335d60406.png → 001486b2-f627-4ece-8c93-4dfec47da9b3.png} +0 -0
  224. /kaa/sprites/{7dc79a8b-bd59-4c93-a638-e49bca276c00.png → 011e352f-6e8b-4225-b104-d1b2ccf0761c.png} +0 -0
  225. /kaa/sprites/{69f15152-8ee9-4e39-9bfa-6cd1b051bc1e.png → 0240342e-b6f3-4ed6-8da5-a64092e6fcde.png} +0 -0
  226. /kaa/sprites/{15801cb7-24f6-4504-921b-5e5a37bdc064.png → 02df555c-b19c-4776-8f1b-d1a7e2ed2f82.png} +0 -0
  227. /kaa/sprites/{55a2ba58-2412-4c39-9c6e-2627092623a2.png → 0343a3b8-8cd6-47af-b956-760dd2c79711.png} +0 -0
  228. /kaa/sprites/{d62dab9b-d36d-490e-bca5-bfd4b66911d7.png → 04c287ed-9ab1-4cd1-af07-8ab61f7f49bc.png} +0 -0
  229. /kaa/sprites/{8d99cd97-ae34-488f-b62e-54d54f75e4e8.png → 05d7740b-c6ea-453a-b805-7d0a5fe18184.png} +0 -0
  230. /kaa/sprites/{66ccbeba-3291-4f1c-8669-d691f24ea9ed.png → 06a7097c-fef6-4f2c-bece-26eed414708e.png} +0 -0
  231. /kaa/sprites/{609a340b-2cfa-4cef-9e55-fb60c7cabdbb.png → 072b167f-a2f6-4458-815e-a92ca2e6c9eb.png} +0 -0
  232. /kaa/sprites/{e881ee18-154e-4f0c-91fe-4699d156671d.png → 0899a6e7-6617-4f11-a7a2-9ba377ad6cba.png} +0 -0
  233. /kaa/sprites/{689eebfd-984c-45c9-812f-26cf9c756bed.png → 0950d760-6d88-4265-b28c-0790a782a749.png} +0 -0
  234. /kaa/sprites/{76d5d7f7-b23d-4802-8f91-7058f7adcffd.png → 0a019c0d-26fa-4441-b281-b73060722bc9.png} +0 -0
  235. /kaa/sprites/{ac194536-54e4-49e7-992c-fc82ba401f10.png → 0a27a783-0ef8-4f99-8c26-cf89768b5146.png} +0 -0
  236. /kaa/sprites/{06ee3b1e-5c99-4ebf-8a23-d6f59cda32b8.png → 0af981f5-bcc9-48eb-a392-50f79ec5149a.png} +0 -0
  237. /kaa/sprites/{e7709d81-890b-438f-8acb-50492d63022e.png → 0afb71f5-0752-47af-9ba2-85bdbe4fcbf7.png} +0 -0
  238. /kaa/sprites/{62cc930f-acc2-424a-975f-164009a555f8.png → 0b83c2e5-ebb4-4a69-8b5f-658774d4c5a6.png} +0 -0
  239. /kaa/sprites/{ad63136d-2360-45e6-b7ef-00e01612c7ce.png → 0be5a84d-eb1e-4bb3-afcd-923e104190f4.png} +0 -0
  240. /kaa/sprites/{be2985ff-c3ac-4d94-9751-c652dd561db2.png → 0c192ca4-dd10-49b4-b0be-9b1fb4637910.png} +0 -0
  241. /kaa/sprites/{bca22a82-f72b-46ca-be06-c1e18b7ad27c.png → 0cae32b3-0248-49ad-98dd-d06a89308797.png} +0 -0
  242. /kaa/sprites/{a694f6e8-6ef9-4761-816a-ad586ce93654.png → 0d1fd6f0-3a6f-4008-a31a-8189dd09be50.png} +0 -0
  243. /kaa/sprites/{cde4da05-d654-4217-8443-752bc0709742.png → 0d2143fa-7e81-4e7a-8a94-c3839719de5b.png} +0 -0
  244. /kaa/sprites/{901b48f9-d7b7-46c2-85fa-b07e427ffdaa.png → 0dbb752b-e60a-459d-80fa-f5b49e8b8e4d.png} +0 -0
  245. /kaa/sprites/{80fa9c6e-fe05-4d3e-ae50-6b7e9a237e0b.png → 0e63e0b7-6874-46e9-86de-8c23e6491f24.png} +0 -0
  246. /kaa/sprites/{603c5369-9247-404d-bc6d-4719d11de6ea.png → 0f4ac9ae-5e4d-4f3f-b9e0-b76570f2b040.png} +0 -0
  247. /kaa/sprites/{7f90beb9-8712-4a53-a818-ff7a5e82d71d.png → 0f8026e8-62a9-49e5-97a6-0d78f33dcfcf.png} +0 -0
  248. /kaa/sprites/{6bcebf50-764b-4bf2-be8e-ba241d8550d7.png → 0f80ac6f-bdf8-4927-8393-c554209f517a.png} +0 -0
  249. /kaa/sprites/{4396a9b8-b7f0-45f3-8a8f-85773a10eecb.png → 116d3f3a-0255-47ed-b656-c26b41a5cfa8.png} +0 -0
  250. /kaa/sprites/{9a0172aa-9489-4985-9c65-c5f6db0a0325.png → 130cd7fd-767e-4177-9087-71f418f154dd.png} +0 -0
  251. /kaa/sprites/{333a1e30-82d3-45b9-8e48-4c127bcb5ec6.png → 138a527b-2191-4f0f-9e36-1d08bbf6ffb1.png} +0 -0
  252. /kaa/sprites/{cee6ca8f-219c-448d-9ba6-d6722f27b600.png → 1472da80-4cbb-41e1-94e8-3ea3defd3b6f.png} +0 -0
  253. /kaa/sprites/{94121408-8cd2-46fc-bf27-33b207e4cba8.png → 14875449-7478-4969-a2d5-91ce34c9d1e4.png} +0 -0
  254. /kaa/sprites/{15da6f78-d89f-480c-9cce-c95e009fd15a.png → 1539fcff-8842-478f-98a8-0d1a885d1b43.png} +0 -0
  255. /kaa/sprites/{97329116-4d2e-40d7-af96-938afdac4e60.png → 16113270-3f35-498a-a29a-52f190d77cc1.png} +0 -0
  256. /kaa/sprites/{545068ad-6f17-40d8-99e1-d26bd5700c67.png → 1617c180-ce9f-461a-bfdc-390337ecb205.png} +0 -0
  257. /kaa/sprites/{e38a2f35-9ac5-4363-bd6d-09893907ea71.png → 16cf9d8b-4f8e-47ce-a63d-fe9bfc3f31e8.png} +0 -0
  258. /kaa/sprites/{4fc6fae5-386d-434c-893d-5450bd5a6396.png → 1b485aa9-f0c0-4b49-ba75-363a8d6e292c.png} +0 -0
  259. /kaa/sprites/{4995d301-375b-4d23-a6e5-b26a771fcbe4.png → 1d560b06-feac-413d-bf90-07ac045f11fb.png} +0 -0
  260. /kaa/sprites/{e16b116c-6a2c-4e5d-8105-8dfc8c4c730f.png → 1d92cb8e-49a7-4166-9682-a5807e0c7912.png} +0 -0
  261. /kaa/sprites/{be04f096-c46b-4784-8e6c-c1217764f6dd.png → 1dadf765-ddd0-4768-9e91-6d3d08d0ca0d.png} +0 -0
  262. /kaa/sprites/{d0652541-e289-4bcd-98ec-a88715f5adef.png → 20cbf6b8-01db-45fe-a790-dbb7dd639b1d.png} +0 -0
  263. /kaa/sprites/{8c4f60d1-d707-4ae5-bd94-d96661ea7bbc.png → 20d01fc0-9a54-4ef5-9983-2bb8414dd94d.png} +0 -0
  264. /kaa/sprites/{011c52b9-613d-4865-afd3-1f0ddab2bc5b.png → 20e1e948-6920-44cd-965e-9e1e37b3fbf2.png} +0 -0
  265. /kaa/sprites/{5ee1b47b-f20d-431b-a0bb-d203b9f3e15b.png → 23922edd-22aa-4514-ba99-65bcd72c2ad1.png} +0 -0
  266. /kaa/sprites/{3d57da0a-b166-4acd-9a8a-b247ba5ad13a.png → 24c2db22-24e2-484e-8c16-8b1c9fe3ed14.png} +0 -0
  267. /kaa/sprites/{f5145781-949e-4012-9ea9-b0a277dac72b.png → 26683d54-74a9-4e7b-a839-c2e0850d1458.png} +0 -0
  268. /kaa/sprites/{2987cb9c-5975-41b3-87f7-cc26efdcee74.png → 27bcc513-9bab-468a-97b8-ed16f918e2a4.png} +0 -0
  269. /kaa/sprites/{c24394f6-ed02-4fb4-8d58-40a7e51b259d.png → 284a19c3-2c06-48a5-8f78-b4682e8ae19e.png} +0 -0
  270. /kaa/sprites/{da615a2f-3334-462c-8535-40067ad1c857.png → 2927cceb-29dc-4c35-8614-1df42fc0733b.png} +0 -0
  271. /kaa/sprites/{0a430b29-9841-407a-a102-ea6420beeaae.png → 2c5784df-e89b-4b95-a4b9-bac083c0ec08.png} +0 -0
  272. /kaa/sprites/{3867054e-a686-4dab-89fb-6a9def58dfe1.png → 2dfa926c-83c5-4f40-adfe-ff04ce448264.png} +0 -0
  273. /kaa/sprites/{d1a6547e-7c58-4500-a7f4-cf462f44395f.png → 2f7f70ea-f3f0-4d14-8885-1a735ff00545.png} +0 -0
  274. /kaa/sprites/{4a5e8c39-4e80-4202-9886-be1a58073fd6.png → 307fcb37-7a90-4a3e-bd3a-64a691aeb5d5.png} +0 -0
  275. /kaa/sprites/{151dc2ce-fce4-4741-ac6e-cc8213f54137.png → 3114b2d5-0a96-4eba-9143-b09eabb63612.png} +0 -0
  276. /kaa/sprites/{1aa14c42-8682-4a75-b4a2-4715481a2381.png → 31168fe2-8601-4de6-aa40-81e7ce452391.png} +0 -0
  277. /kaa/sprites/{f3400d73-4f61-4027-b5d8-03765a63a186.png → 31b025df-ed25-4bc4-a94a-d05388e9156e.png} +0 -0
  278. /kaa/sprites/{0c211c20-096e-4572-8e74-3867904db1f6.png → 32af48d2-fb5b-4288-930f-eb36edfe2116.png} +0 -0
  279. /kaa/sprites/{0803c844-7085-4492-ad68-0ce3b11f9840.png → 34e50d77-7b95-4bb7-8c62-ad6801dc0e55.png} +0 -0
  280. /kaa/sprites/{bd5b168a-de03-46b3-b1b7-9fa9667f4642.png → 3658a26d-98d3-462a-abf4-4d8b74aeb134.png} +0 -0
  281. /kaa/sprites/{562deb0a-99bd-4e95-80ff-f933a73c28ad.png → 36f11c55-e110-44b7-a800-85f4d7584560.png} +0 -0
  282. /kaa/sprites/{9c827df9-2e47-4bec-95b7-8ccad6377a28.png → 38bb2a90-b2a9-4f85-9025-662e83ab1ed1.png} +0 -0
  283. /kaa/sprites/{eebbccac-25a9-465e-b7c8-3bfdaf0bf0b9.png → 38f70a7e-5f7e-4ee6-a7c5-5f8014734719.png} +0 -0
  284. /kaa/sprites/{6f79221a-8c47-423e-ac72-27d97c559d63.png → 3aceddce-09db-422a-8023-e08d41070cc8.png} +0 -0
  285. /kaa/sprites/{3fe4ec28-3b2a-4042-ace1-ceec5c8f48b1.png → 3c224540-1571-435a-b8e6-2317e4411438.png} +0 -0
  286. /kaa/sprites/{f2913d0b-342c-4de0-8235-fe3f1c580d2e.png → 3d9a9493-7616-4b2b-867e-44e776d831c0.png} +0 -0
  287. /kaa/sprites/{a8bef06b-9287-4f54-b96e-19463031d26f.png → 3fd694ea-8396-4cf3-9ba6-eaf95b61e8c8.png} +0 -0
  288. /kaa/sprites/{fd16e035-699c-4dc9-9721-61443cd6fd63.png → 4055dbef-1523-43b7-9183-6b2721b4307b.png} +0 -0
  289. /kaa/sprites/{606d4740-8af9-40f6-af18-ad9f73cecf68.png → 4059ec2d-cd20-4dd3-8586-e49a4cfa8717.png} +0 -0
  290. /kaa/sprites/{9ea3c9b4-80f3-44b9-90e3-cfc406f814be.png → 4280fa1d-4223-4fc4-85f9-caf6157cb004.png} +0 -0
  291. /kaa/sprites/{436ec8e4-aa4a-4b1f-940a-2ab55baa098d.png → 43bc2116-7fe3-4b20-8c8b-3ab2a2b5dd7d.png} +0 -0
  292. /kaa/sprites/{39815c36-38c5-4066-aff5-2177c232b4f4.png → 43d3fe01-27c0-4d3f-a908-aebd00ab219d.png} +0 -0
  293. /kaa/sprites/{9c6378a9-62ed-4881-bc6f-2166bbb470c7.png → 45062c9b-a31d-457b-83a2-9b6891384a15.png} +0 -0
  294. /kaa/sprites/{e630b33a-e73e-4271-96b9-860b94fb48ca.png → 4516d0e4-9280-4f91-ba7d-fc8af83a9996.png} +0 -0
  295. /kaa/sprites/{916391a4-09b7-409c-ba25-391b61a65e62.png → 458b8bbe-9fa5-48d4-907b-66d36baf16a1.png} +0 -0
  296. /kaa/sprites/{9092a171-66f0-47dc-99dd-bb5d7359077a.png → 45af668c-2324-4fe4-83e0-11d65cfaa086.png} +0 -0
  297. /kaa/sprites/{297fb9e0-9553-40fb-ad08-f5ab718ef119.png → 45bdb006-bea5-4a1f-bf1a-c3bcb2e99abd.png} +0 -0
  298. /kaa/sprites/{1bf95df3-255f-4e89-9b17-0af77f4affd6.png → 47186b16-f478-4a53-8e49-a132ee4c78db.png} +0 -0
  299. /kaa/sprites/{1f6805bb-dff1-4d4c-82bf-74563056cc81.png → 4876c6f3-17a5-4858-b1d1-ebb5619516c5.png} +0 -0
  300. /kaa/sprites/{b2c8ac50-87a3-4cdd-a895-9704a9674163.png → 491bd489-7a08-47b4-b1b7-5d0f44cedbca.png} +0 -0
  301. /kaa/sprites/{484594b4-06a2-4ec3-8a85-e7af3b012125.png → 4a853ac5-24d5-44ac-8ddf-9f501c60a9be.png} +0 -0
  302. /kaa/sprites/{f6e26f3c-2548-4507-8651-53917e0fe82a.png → 4b88639e-1f17-4e11-90b6-bb122f8cb5ab.png} +0 -0
  303. /kaa/sprites/{935d8115-245f-42ff-ad74-55f4e6d140b1.png → 4dc5f817-86bc-4433-aeb5-b02c7b63fa8c.png} +0 -0
  304. /kaa/sprites/{b379d704-fc45-42f9-a45c-d81a6c5ee951.png → 4e3a9fd3-86aa-4e14-ae48-46e53a553da2.png} +0 -0
  305. /kaa/sprites/{7df9b645-ff88-4459-8ba7-450da538cfd9.png → 4e7f7b91-344c-4fb2-95fe-004831e81b11.png} +0 -0
  306. /kaa/sprites/{24b3cf5c-0586-41cc-abfb-df48de07fa77.png → 511232f6-01d6-482a-81a3-2bf79a6e88ed.png} +0 -0
  307. /kaa/sprites/{101a9c54-ab8c-4b5d-a4e0-686b93b4e1d9.png → 546cb160-f99b-4cda-9719-02b38a5393a0.png} +0 -0
  308. /kaa/sprites/{74e4c222-0006-4295-99d0-a01aa8b94dc2.png → 56bc2743-5dd9-4d09-a681-af9d1fec568b.png} +0 -0
  309. /kaa/sprites/{d11f07b1-f2e9-4c41-9ad9-81529121afd4.png → 5701ecbe-7fed-435c-b409-75f8b0f2df51.png} +0 -0
  310. /kaa/sprites/{6dd4ca2b-69ca-4099-9e69-2144ce9a4d28.png → 58de1cf0-4270-4987-9dc7-3f584f1119d1.png} +0 -0
  311. /kaa/sprites/{48eb2e27-7419-4136-9642-7af1a6f83ed9.png → 5a337f99-8554-48bf-acb7-364259fbf1b7.png} +0 -0
  312. /kaa/sprites/{ccad6a54-73f6-48b8-a86f-16b9e0f46e41.png → 5cb4deb9-2ec5-4452-aba4-390eae2071c7.png} +0 -0
  313. /kaa/sprites/{f136dd9f-43c8-44cc-b081-1f86d7ce38d4.png → 5d42f16f-3475-4ffb-ac85-3c86fa8fba46.png} +0 -0
  314. /kaa/sprites/{52aba1bd-1e82-46a7-8003-0aac11586a38.png → 6c5698a4-b211-4f38-83a7-51b5f3a36911.png} +0 -0
  315. /kaa/sprites/{0ec56b89-81f2-478d-907e-b04aab199e86.png → 771d1e17-8ef4-417a-b482-26db514e17c6.png} +0 -0
  316. /kaa/sprites/{c23c29cc-ef42-46d8-8b58-283b74a254cc.png → 7833fa1e-c842-4efd-a696-c67150a1dfa8.png} +0 -0
  317. /kaa/sprites/{2bb41b59-61f8-4109-a550-faa6a14708de.png → 791b3367-fb7c-48b5-9a0f-877908e51c4a.png} +0 -0
  318. /kaa/sprites/{47cbfa79-0b33-4ccc-b762-21e3a141a7bc.png → 7bb874a3-3fac-4138-83bd-d6461c5793d3.png} +0 -0
  319. /kaa/sprites/{fc77cc87-f8eb-4b33-834c-ee5d2af5ca44.png → 7d4d06a8-7903-4803-a20b-7f45ffbe9ca7.png} +0 -0
  320. /kaa/sprites/{b581ae5b-cb67-4bf9-8ffe-72b8ba56d887.png → 81553259-3b0a-42f7-b7b9-2c6e1dfec6c4.png} +0 -0
  321. /kaa/sprites/{eda88516-ac6b-4f26-b074-f8e6e2ae42a5.png → 827cec52-d883-46d1-b24b-c11c82b1b459.png} +0 -0
  322. /kaa/sprites/{9966acd5-973a-4afb-a006-c1fa66cfe679.png → 8473bc42-1909-4d70-b80d-7eba085c9978.png} +0 -0
  323. /kaa/sprites/{c16ae471-7d60-4c1f-9981-1090414a7ea0.png → 84797a78-97f3-44fa-b3c0-132c914f534a.png} +0 -0
  324. /kaa/sprites/{df54b1e4-035c-4937-9360-19b4733826e6.png → 861bd6b8-cca7-46b1-9346-83af080e211b.png} +0 -0
  325. /kaa/sprites/{436b9822-c946-4d2e-a432-8f3159705b37.png → 8f5081e4-ed3d-445b-bcf6-2e40c7d08298.png} +0 -0
  326. /kaa/sprites/{5bb33faa-8236-4e17-92bd-ad709795f261.png → 91dbaa9c-7881-4687-bd64-8f25c201d98c.png} +0 -0
  327. /kaa/sprites/{95e11d11-f330-4906-a128-6492f95176e8.png → 93f3f6a9-e9d2-45b7-a2b3-1e8b64d10e9b.png} +0 -0
  328. /kaa/sprites/{dd59548d-0800-49d3-8701-b2b2e8512c36.png → 943cde40-f190-40b6-9235-4439fbb4ae50.png} +0 -0
  329. /kaa/sprites/{7678902c-57df-4cf8-87ef-11c85f02214b.png → 97f3fb5a-fce2-4cc5-9da5-f0496e9dd294.png} +0 -0
  330. /kaa/sprites/{d051b4c3-354e-4d69-95f6-14f5017ed79e.png → 98a68736-c4ec-4af1-ac64-40eb48f9c000.png} +0 -0
  331. /kaa/sprites/{a9029026-7a7e-4f8e-9620-bd451bfdf284.png → 9af13381-661d-41cf-b704-e4a9c3691e14.png} +0 -0
  332. /kaa/sprites/{5a892ef3-543b-4fad-bdca-5358314d6be7.png → 9b91dc78-49e8-41b2-9500-c27cb46023c4.png} +0 -0
  333. /kaa/sprites/{920ea830-31a8-4256-b247-7b9507030783.png → 9d0bf64a-2684-43fa-b9bf-552e60c717b4.png} +0 -0
  334. /kaa/sprites/{b37685c3-74a8-4393-ad79-c445ab2d77be.png → a32fa779-2fb9-488e-9153-0b99e4352281.png} +0 -0
  335. /kaa/sprites/{9f81bc0f-da2c-4321-a185-b2d8a3f0d390.png → a6269fe5-e719-43ad-b674-ea728e43066b.png} +0 -0
  336. /kaa/sprites/{2beaba86-119e-4a1c-8cf4-e03c4d0d957a.png → a8ca6a10-ba0a-4416-a27b-3323d38040ab.png} +0 -0
  337. /kaa/sprites/{f258af39-e8be-4e19-aafc-bfedce9793c0.png → acaea032-45b8-4ad8-8b54-ff011750af80.png} +0 -0
  338. /kaa/sprites/{ed7adff5-1604-4ade-ac2b-a30167ef457c.png → ae5a051e-37f5-4e54-bfc7-64c445ad6fcc.png} +0 -0
  339. /kaa/sprites/{30604b47-7c8b-4dd5-b926-fd33bad575c7.png → af5a6ae7-a355-492e-86a8-62fa2b06bb54.png} +0 -0
  340. /kaa/sprites/{36e6c1ea-8de5-4640-8340-b8f532ef40c0.png → b406baf0-fa0b-4125-adc6-d370582a6104.png} +0 -0
  341. /kaa/sprites/{42bfc60c-0249-4910-ad04-80e559b52c6b.png → b62f9c30-1faf-47fc-be8f-36db3806c5dc.png} +0 -0
  342. /kaa/sprites/{56bcde1a-5cd7-493d-a2cd-2a63394c0c36.png → ba1983ce-bf63-4022-9ef3-dcf97030e6c5.png} +0 -0
  343. /kaa/sprites/{8e648675-1a52-4926-92cf-64c7cb5c2a59.png → ba971684-1fe3-47e1-8bdb-d20a0011ea68.png} +0 -0
  344. /kaa/sprites/{3af1e6de-e718-4a09-8ee9-88be21cd4b3d.png → bdbed86f-553c-458e-9435-d587005b367d.png} +0 -0
  345. /kaa/sprites/{e2944d47-159f-4200-b476-8d5db41d30c0.png → bee41ab5-c62e-4a79-a8d0-40f9efbc7e40.png} +0 -0
  346. /kaa/sprites/{bfaf3273-76bf-457a-88b7-6816af742a30.png → c344b05d-2707-43b0-9e3e-4ec433558dcb.png} +0 -0
  347. /kaa/sprites/{7df273dc-69f7-45b9-a782-b221783f851b.png → c3c495a2-1530-439f-a10e-76ca5d929cce.png} +0 -0
  348. /kaa/sprites/{76262c30-a2ee-45ba-8279-ca682cee0bd6.png → ccac6d8e-bca2-4ab6-b88b-c0f5ba83df84.png} +0 -0
  349. /kaa/sprites/{574b2741-c4ac-4ee4-a544-f4f499e4a21e.png → ce7cec02-4039-4171-87ed-37eccc4ac832.png} +0 -0
  350. /kaa/sprites/{6dead493-c4e6-4ba9-ac56-abe8c511abbd.png → f72e9d65-68e7-4bb6-be44-4b5ed71f0bce.png} +0 -0
  351. {ksaa-2025.9.post2.dist-info → ksaa-2025.11.dist-info}/WHEEL +0 -0
  352. {ksaa-2025.9.post2.dist-info → ksaa-2025.11.dist-info}/entry_points.txt +0 -0
  353. {ksaa-2025.9.post2.dist-info → ksaa-2025.11.dist-info}/licenses/LICENSE +0 -0
  354. {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 ValueError("No produce solution selected")
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']