ksaa 2025.8.2.0__py3-none-any.whl → 2025.8.23.0__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 (155) hide show
  1. kotonebot/backend/loop.py +276 -276
  2. kotonebot/kaa/application/core/idle_mode.py +172 -0
  3. kotonebot/kaa/config/__init__.py +2 -0
  4. kotonebot/kaa/config/schema.py +11 -0
  5. kotonebot/kaa/main/gr.py +68 -25
  6. kotonebot/kaa/metadata.py +23 -0
  7. kotonebot/kaa/resources/__pycache__/__init__.cpython-310.pyc +0 -0
  8. kotonebot/kaa/resources/game.db +0 -0
  9. kotonebot/kaa/resources/game_ver.txt +0 -0
  10. kotonebot/kaa/resources/idol_cards/i_card-skin-fktn-3-013_0.png +0 -0
  11. kotonebot/kaa/resources/idol_cards/i_card-skin-fktn-3-013_1.png +0 -0
  12. kotonebot/kaa/resources/idol_cards/i_card-skin-hmsz-3-002_0.png +0 -0
  13. kotonebot/kaa/resources/idol_cards/i_card-skin-hmsz-3-002_1.png +0 -0
  14. kotonebot/kaa/resources/idol_cards/i_card-skin-jsna-3-008_0.png +0 -0
  15. kotonebot/kaa/resources/idol_cards/i_card-skin-jsna-3-008_1.png +0 -0
  16. kotonebot/kaa/sprites/70898bf8-56c5-4f84-becb-629c9ab6a7da.png +0 -0
  17. kotonebot/kaa/sprites/9fd0753f-c607-4d49-82d1-40bda27e014f.png +0 -0
  18. kotonebot/kaa/sprites/a48324ae-7c1a-489e-b3c4-93d12267f88d.png +0 -0
  19. kotonebot/kaa/sprites/ce20a856-5629-4f8e-a8e1-d1bd14e18e4f.png +0 -0
  20. kotonebot/kaa/tasks/R.py +131 -127
  21. kotonebot/kaa/tasks/daily/purchase.py +10 -5
  22. kotonebot/kaa/tasks/produce/in_purodyuusu.py +3 -3
  23. kotonebot/kaa/tasks/produce/produce.py +3 -3
  24. {ksaa-2025.8.2.0.dist-info → ksaa-2025.8.23.0.dist-info}/METADATA +89 -89
  25. {ksaa-2025.8.2.0.dist-info → ksaa-2025.8.23.0.dist-info}/RECORD +155 -146
  26. /kotonebot/kaa/sprites/{6b2bd35a-d399-4486-b4ef-24abb3e6669f.png → 00707545-6ed3-4c3a-9c84-89cb75ac1adc.png} +0 -0
  27. /kotonebot/kaa/sprites/{d2bce7a9-8709-4042-a31a-1f07b2711637.png → 03985ce5-781f-4c1b-8d49-c5f97010d5ff.png} +0 -0
  28. /kotonebot/kaa/sprites/{77c9d69b-1078-477f-897f-c50bc5013fd5.png → 04622143-7f9e-47a8-86a5-be2b81d13cb6.png} +0 -0
  29. /kotonebot/kaa/sprites/{ee191a7a-ed3e-46e2-a07a-2ca7d566d0f6.png → 04b33e1f-a341-46d4-a54b-a05f1e765c10.png} +0 -0
  30. /kotonebot/kaa/sprites/{c2841576-352b-41de-95d8-3f2640504c9c.png → 06df0c16-bb7e-41b7-90fe-afc14379b90f.png} +0 -0
  31. /kotonebot/kaa/sprites/{1ec343a7-f6d4-4ab5-967b-66f900438977.png → 08f593a9-d9eb-41ee-b2c0-010562e7ef10.png} +0 -0
  32. /kotonebot/kaa/sprites/{cde81597-2e0a-4795-910a-6e475d7cc073.png → 0bd59a8f-6fbd-4c92-8c1e-1d58716b6d84.png} +0 -0
  33. /kotonebot/kaa/sprites/{66cc412b-a4a1-4b42-89b4-7653eef41204.png → 0e332904-cace-4d02-9575-100a359c548f.png} +0 -0
  34. /kotonebot/kaa/sprites/{2d59f524-840a-445f-b432-c97051eb7043.png → 1262d83a-8f2a-4f75-b70a-385a04d35ae1.png} +0 -0
  35. /kotonebot/kaa/sprites/{8fb0f6d1-388b-41b3-964b-5965c58605c7.png → 12f47930-f691-4a3e-8c83-e47f63fb1f2b.png} +0 -0
  36. /kotonebot/kaa/sprites/{7c6dd46a-62ff-4d2c-b04a-df97ba55ed74.png → 146c742a-0fb3-4d88-851e-ddd621533ad3.png} +0 -0
  37. /kotonebot/kaa/sprites/{b144b5df-c3b5-4bda-bb3d-9c8fa1182080.png → 1a06449d-472e-4c06-9dc1-1cb06b1b1ce5.png} +0 -0
  38. /kotonebot/kaa/sprites/{9fa1e59d-36cb-43c9-a788-ed95ae93f3d0.png → 1b60b852-dc93-48a1-8b73-0d728d04e057.png} +0 -0
  39. /kotonebot/kaa/sprites/{6770f2b1-1619-4937-bf8d-284b90a5d3c6.png → 1dd337ca-20f1-4dc6-8254-235d7ec74158.png} +0 -0
  40. /kotonebot/kaa/sprites/{2b225eb3-c1b2-415a-99de-1a41a0ed4470.png → 1e17f7b1-4f64-474c-aade-4b3de32c0de4.png} +0 -0
  41. /kotonebot/kaa/sprites/{785837db-1da3-46d0-866f-017c232547ad.png → 2227a4ac-a933-4165-b594-2720a26f9e44.png} +0 -0
  42. /kotonebot/kaa/sprites/{58f1212f-a307-4179-a55c-8449e237cb3d.png → 229366ae-dbcd-4378-84a2-8a7eb1d1e084.png} +0 -0
  43. /kotonebot/kaa/sprites/{ddb5b885-93de-49d1-8150-3235d702c1c8.png → 25ceaa36-a432-4bf3-80b7-11c94cd82357.png} +0 -0
  44. /kotonebot/kaa/sprites/{72ea8e77-8773-47bf-9c5f-bf51812065cd.png → 276239b5-e41b-4ae5-9be6-37d251292d39.png} +0 -0
  45. /kotonebot/kaa/sprites/{5da76978-7dc4-4d4e-8e4c-e3189e2c2b07.png → 288a0541-a175-47b4-b75c-2e845e27cba6.png} +0 -0
  46. /kotonebot/kaa/sprites/{9552c822-a654-46a8-acd9-0320a4b6118b.png → 29449202-a6cc-4080-bb87-816481ec9506.png} +0 -0
  47. /kotonebot/kaa/sprites/{d7c2d507-640e-4705-92d0-d2e3951cc29b.png → 2ee5d498-1370-4f09-b187-41dbe582f498.png} +0 -0
  48. /kotonebot/kaa/sprites/{74d02db5-a02d-43d0-ae7a-5aeba90249be.png → 2fa084f5-0637-4d53-ada8-9c542d597a51.png} +0 -0
  49. /kotonebot/kaa/sprites/{9169b74f-7458-4562-bc90-41efe0edfc22.png → 2fc0a912-8d9b-48a3-b942-a25274c83edd.png} +0 -0
  50. /kotonebot/kaa/sprites/{c2d305cc-8fb4-4f34-a9b3-96862837a36b.png → 30ce2e03-e9b3-4b4f-aded-51a05bfca91f.png} +0 -0
  51. /kotonebot/kaa/sprites/{9cf406dc-bd69-4919-a396-d7e267b01645.png → 359d6d34-ea55-470b-b682-6c9252953e8d.png} +0 -0
  52. /kotonebot/kaa/sprites/{8cd02d5b-96f7-4b59-8676-ca07a63a7693.png → 35f613e8-61af-41b0-a397-44ae7566a233.png} +0 -0
  53. /kotonebot/kaa/sprites/{a9c016ed-463b-4e06-88ce-020c2b4dd981.png → 36039a1a-52e6-428d-9866-0f0f65a7298f.png} +0 -0
  54. /kotonebot/kaa/sprites/{203dfb12-640e-4437-9040-47045c9b8cbd.png → 3675c4aa-a208-47d1-bbcb-48bce40e6ae9.png} +0 -0
  55. /kotonebot/kaa/sprites/{e97c5043-a73e-4979-a529-34b4daaee88d.png → 3746df74-fe63-442c-85d2-8a3696cb2fcd.png} +0 -0
  56. /kotonebot/kaa/sprites/{d3a1c862-8f02-4aca-8b58-bbd337ab48bf.png → 382cb218-9e58-406f-9a3b-a9d990fc0fff.png} +0 -0
  57. /kotonebot/kaa/sprites/{88e9493c-0914-489a-9d99-addff4f0efd0.png → 3997a0e3-0826-4b1e-b7e9-4a36ebaaa9e8.png} +0 -0
  58. /kotonebot/kaa/sprites/{4a395a76-b1b6-4541-97b0-2e2603d47360.png → 3a41fe06-7f33-4c21-9edd-291191e3c563.png} +0 -0
  59. /kotonebot/kaa/sprites/{2a317f0e-613e-48c4-9def-d18a3b834254.png → 40fc17b0-718c-432d-b784-92a22c2f7512.png} +0 -0
  60. /kotonebot/kaa/sprites/{d400ab2d-b4dc-43bb-bb77-f49c666bf4b1.png → 45abba60-06d7-4921-b2a2-9ce790c2b25b.png} +0 -0
  61. /kotonebot/kaa/sprites/{9dc6ec60-597c-4305-b251-2e3342603446.png → 47d9fac4-2caf-4479-a97a-e519ddbfb3cf.png} +0 -0
  62. /kotonebot/kaa/sprites/{c85ba9aa-9ff1-42a4-b80a-ef39ab009e85.png → 4d0f75f5-632b-4c59-88a5-058622a4c3af.png} +0 -0
  63. /kotonebot/kaa/sprites/{d6182579-dc5d-4db9-a8be-0a7f3998abde.png → 4f2fcec7-399e-4184-b1dc-eabae92d63dd.png} +0 -0
  64. /kotonebot/kaa/sprites/{343d630f-375f-496a-98c5-75a1e0aa2c2c.png → 4fd7d95e-7955-4a70-ad91-67a230c647a3.png} +0 -0
  65. /kotonebot/kaa/sprites/{fbea0ab6-3094-438e-807d-5a24d0d32cf3.png → 54e29f7f-c951-46a2-a068-6911dfcf1966.png} +0 -0
  66. /kotonebot/kaa/sprites/{b28eac50-4517-4fc3-8fd9-a6a7f8d19ba5.png → 5528a0a0-2f1e-41f8-b55f-a565a2f80908.png} +0 -0
  67. /kotonebot/kaa/sprites/{1564ee9a-c2eb-4284-b22a-dd8df7c8a32f.png → 57cee3e6-eee4-4023-85f3-52959fa372a0.png} +0 -0
  68. /kotonebot/kaa/sprites/{5bf54b6d-d2b6-4211-b3f4-0713b84dd315.png → 5b2e7826-0e1c-4fd8-965c-6a3498c59825.png} +0 -0
  69. /kotonebot/kaa/sprites/{727c2d86-0daf-47d3-8eb4-500e648abfd6.png → 5cd3481b-2388-4461-b525-c2f78050822f.png} +0 -0
  70. /kotonebot/kaa/sprites/{d1b23182-244c-4e94-ac46-894b3117d1bb.png → 5fb7c821-63b4-4ee2-b6ea-16eec3a77251.png} +0 -0
  71. /kotonebot/kaa/sprites/{5c2e3a85-838c-41d5-b55e-b62fc1b95a1e.png → 5fb96a83-7b37-435b-9d7e-9caf0bc022e4.png} +0 -0
  72. /kotonebot/kaa/sprites/{92d4209d-5053-4284-a9f5-63372c8cd05b.png → 62676c2c-814a-4d8b-9bb2-232c3b434287.png} +0 -0
  73. /kotonebot/kaa/sprites/{248f9401-c340-474f-baed-1a523f441f3e.png → 651b2464-0c4a-4f3d-9452-5a40897b39e1.png} +0 -0
  74. /kotonebot/kaa/sprites/{9713c534-6f51-45c7-a03c-1acb642c519c.png → 658eb246-1469-4a86-b7a7-5e66b3102084.png} +0 -0
  75. /kotonebot/kaa/sprites/{1193a4e3-4d0d-4433-97ce-b19aeb6846c5.png → 65dbaa8c-2053-4441-9c31-8fd8fc8c87d8.png} +0 -0
  76. /kotonebot/kaa/sprites/{8fc97425-3b86-42cd-820d-2ad6321508f3.png → 67da7040-7183-4d30-89a7-e78345f42948.png} +0 -0
  77. /kotonebot/kaa/sprites/{74423820-b24e-4dd1-b6c4-7ef3d6aa3b8c.png → 6a272201-1311-41ee-b296-0a8d812d8173.png} +0 -0
  78. /kotonebot/kaa/sprites/{a9e90b22-4415-44cf-bf2f-6acb2733312f.png → 6a59aafc-4962-490e-8ab1-9ad59d22db3d.png} +0 -0
  79. /kotonebot/kaa/sprites/{52e0b7fe-271f-4713-b1b3-b06a286630d7.png → 6aa1fbb0-3880-49e1-ade3-29f627d0e38b.png} +0 -0
  80. /kotonebot/kaa/sprites/{ab39be69-bf52-4250-8e38-25b04d1e6a87.png → 6bb37f56-bac2-4852-82b0-e9b65ce0cbe8.png} +0 -0
  81. /kotonebot/kaa/sprites/{de804900-3470-478e-a51f-e3919b301326.png → 6d58dbfa-84e2-4a84-8c7c-133e459e9b40.png} +0 -0
  82. /kotonebot/kaa/sprites/{50ca8582-8787-45ff-a6b6-e1f0e8b44cb5.png → 71e84fb3-9474-4bbc-8543-ffba5758dcc0.png} +0 -0
  83. /kotonebot/kaa/sprites/{01e8e85e-056c-4428-9cb2-4024c4e6d022.png → 72a9238a-de6d-4665-85d4-265180d00db2.png} +0 -0
  84. /kotonebot/kaa/sprites/{891d4f63-df7f-462c-8908-ff4380c91b8b.png → 7533e4fd-e411-4386-a0fb-aa8f2cbeb216.png} +0 -0
  85. /kotonebot/kaa/sprites/{c673c1f3-2ac5-4fef-a9a2-203e67e1fd10.png → 77b0a64c-1e14-41d6-94af-8824982f2119.png} +0 -0
  86. /kotonebot/kaa/sprites/{b1c80e35-8949-4425-8b96-1df803cacde5.png → 78e27204-2544-419d-b66e-e9e7244f4460.png} +0 -0
  87. /kotonebot/kaa/sprites/{5b94cf27-4aa0-4de1-a9f2-ba8f5ca790fd.png → 791e885e-6e27-498f-81ff-87a40582507d.png} +0 -0
  88. /kotonebot/kaa/sprites/{327733fe-e68a-4f96-9e42-2b16629cbf8a.png → 795961a5-78c5-4ac4-a250-b1879cd2f60d.png} +0 -0
  89. /kotonebot/kaa/sprites/{190c0a4a-24c2-4717-8a78-ffa7bb0366d2.png → 7a54f094-bc75-48d3-8253-cca80a7052a2.png} +0 -0
  90. /kotonebot/kaa/sprites/{065cbac0-e09a-4bec-aa10-5fdb41720d31.png → 7b8541a8-9e82-410b-b053-3ebc96b36604.png} +0 -0
  91. /kotonebot/kaa/sprites/{9acad6e8-8380-47c9-bac8-3144c9b7b765.png → 7eff6c59-a7ed-43d5-8b67-083127e9e748.png} +0 -0
  92. /kotonebot/kaa/sprites/{644a3f8a-6b32-4c3e-9701-acb426502f81.png → 7ff80aa1-94c3-417e-9fae-3c2f2b8036a8.png} +0 -0
  93. /kotonebot/kaa/sprites/{b7bd78a1-aa4a-4847-8e9a-969989ef3cb3.png → 80ae6f18-cc26-4b31-9202-b5a0656b23ce.png} +0 -0
  94. /kotonebot/kaa/sprites/{876ec159-fc25-4c97-9c37-e3ffaba7618b.png → 80fac9c6-e6de-4fb5-9543-77797ffcde7a.png} +0 -0
  95. /kotonebot/kaa/sprites/{ddc4b13a-4a0f-46fd-8fcb-01100058f78a.png → 833ce8cb-01cd-4457-94b9-ff3f93d33f05.png} +0 -0
  96. /kotonebot/kaa/sprites/{df11deb8-940d-45a3-89b7-48c814735448.png → 8a62a66d-4b66-42d5-b004-b56eb7c45d68.png} +0 -0
  97. /kotonebot/kaa/sprites/{c75bba52-b3a5-4565-bb45-104ebed9e3d2.png → 8b3cfcfc-fa00-4bc5-9ea4-b350f2c08cb0.png} +0 -0
  98. /kotonebot/kaa/sprites/{fe9a7ad5-4506-4dfe-80a5-6f4bb9703f9c.png → 8bad2dbc-9f3a-443f-a3ff-048e70577a97.png} +0 -0
  99. /kotonebot/kaa/sprites/{96b9b3cb-7131-46ba-a193-f46446f72194.png → 8bdcc43b-876d-451f-b300-67c16c6f5c9f.png} +0 -0
  100. /kotonebot/kaa/sprites/{9f8332c7-95b4-41ec-8e7f-f5ece0a545e1.png → 8c9c9195-4eed-407c-b1ab-bb616c7b2acc.png} +0 -0
  101. /kotonebot/kaa/sprites/{180b211b-3b77-43a9-b550-6624f1b1beb1.png → 94165d54-2c09-427f-9cb1-e23fa9b06a96.png} +0 -0
  102. /kotonebot/kaa/sprites/{5ac654b1-f891-46b4-a4b2-3b8f9a60a02b.png → 98deb79d-e32b-4551-bc26-c4722d2b1307.png} +0 -0
  103. /kotonebot/kaa/sprites/{5f1e618b-a1fc-41c6-9b05-f2a76c38feb5.png → 9a816f64-b16e-4e8a-b4d8-d056c31c85f1.png} +0 -0
  104. /kotonebot/kaa/sprites/{39ab37d4-2654-4102-ba75-17d6bbd79673.png → 9b0f6620-5fd0-4393-ae67-555baf171550.png} +0 -0
  105. /kotonebot/kaa/sprites/{3fa41725-c619-4ed8-811c-c6f0e9366126.png → 9d9dd078-9bb3-4f5f-9ef5-63c203bf02c9.png} +0 -0
  106. /kotonebot/kaa/sprites/{43c175e2-7e7e-405a-8c92-0cf3d7400d12.png → 9e5afe22-f817-45f7-b0dd-2c808adff8cb.png} +0 -0
  107. /kotonebot/kaa/sprites/{cd1f5c42-582e-408e-bb9f-08f7b868d9fc.png → 9f41a6b4-2955-4105-8610-423f267807de.png} +0 -0
  108. /kotonebot/kaa/sprites/{969ddfa4-c0c8-41c8-b51b-40febf152c7a.png → 9fb0f700-1eaf-4677-bd1f-05f9f311cdfc.png} +0 -0
  109. /kotonebot/kaa/sprites/{133ea490-fefe-4785-b531-3cc7072338da.png → a04c4402-e071-401a-9549-d573eabc0e59.png} +0 -0
  110. /kotonebot/kaa/sprites/{ab823208-66f4-4a97-836b-024bf27b7c74.png → a18a08f5-c752-4fa4-a451-b48f5ca11360.png} +0 -0
  111. /kotonebot/kaa/sprites/{19060076-f971-411c-9b1b-f22e18871b74.png → a1bae28b-7b90-4009-b384-79f7a8974078.png} +0 -0
  112. /kotonebot/kaa/sprites/{aec4ecf4-c1d7-424f-8acc-388ff286a360.png → a4935638-882c-4d3f-af77-e5888ad0b71e.png} +0 -0
  113. /kotonebot/kaa/sprites/{6006a923-8f9b-4dfc-aa81-1e4672db6908.png → a898c01d-1347-484f-b2b0-10858a1ef3a6.png} +0 -0
  114. /kotonebot/kaa/sprites/{3ac2cb20-6563-4505-85bc-1fd3b93902a3.png → a921b8d5-93b7-4346-9ae4-d2e1def1ec1a.png} +0 -0
  115. /kotonebot/kaa/sprites/{356f4aa8-ebc5-4edc-9724-badf6d02d61e.png → a975a75e-e774-481b-8ade-9b1229bc95dd.png} +0 -0
  116. /kotonebot/kaa/sprites/{a5a16fb6-5513-4e17-b871-968425bfdf81.png → ad455e8e-fb2f-4180-af29-7ef66c98daa9.png} +0 -0
  117. /kotonebot/kaa/sprites/{cfd353f0-073f-462e-928b-3cda9344eec4.png → ae1a5e05-d53d-43aa-9f27-b9117483d19e.png} +0 -0
  118. /kotonebot/kaa/sprites/{f2b30fe6-1a32-4f0f-98c1-478e90db1f1b.png → aeff3068-5f5c-4685-a328-fe367d426c46.png} +0 -0
  119. /kotonebot/kaa/sprites/{0300702d-1023-4af7-9fee-54c058f7f1a8.png → b5a883c1-8086-4c60-a789-a7819c674645.png} +0 -0
  120. /kotonebot/kaa/sprites/{9acf0817-ab1f-45e1-a26f-99c3c331a184.png → b5ecb8e2-8b1a-4240-a2c9-152ccecdacbe.png} +0 -0
  121. /kotonebot/kaa/sprites/{58cbe76f-7cab-490d-8668-1076e76d9e9f.png → b6cda449-d5ab-4a38-9c85-c25e1b73f588.png} +0 -0
  122. /kotonebot/kaa/sprites/{9ce465b3-b4a6-4646-a559-3088621a1da1.png → b9e687ca-ba44-4aa1-a282-b7da6cffb2ba.png} +0 -0
  123. /kotonebot/kaa/sprites/{9a3c04af-7ba4-4520-a666-3045c1b3385c.png → bc393fa9-317c-48f9-88cf-cd4d93af1569.png} +0 -0
  124. /kotonebot/kaa/sprites/{ab52b70e-ca1f-47fe-aff8-0bfae7eeb8ff.png → bdc3b84b-18a4-4abe-938d-3e6495bef7eb.png} +0 -0
  125. /kotonebot/kaa/sprites/{c447f3cf-05b3-413d-9a50-f09a22b17e8d.png → bfa4b6bf-c032-46b8-9ce3-268717e4e364.png} +0 -0
  126. /kotonebot/kaa/sprites/{ed84a435-c52c-4294-ad80-bf3c63e2878d.png → c1504a57-77f0-46ca-a30b-162120489d5c.png} +0 -0
  127. /kotonebot/kaa/sprites/{1935d9dc-84ff-47a8-a65b-a458a224b4cc.png → c3d5a935-6e77-4751-a0b1-b1ac3a3edf0a.png} +0 -0
  128. /kotonebot/kaa/sprites/{44d9cfe6-742c-46de-8f53-4f49babfabcc.png → c86250ac-bde0-45bb-b696-f8b94e2d2d3b.png} +0 -0
  129. /kotonebot/kaa/sprites/{55e853dd-07bc-4086-8a2d-60d24ff75839.png → c89ce004-a437-4b94-9420-0d9bf2ed7e25.png} +0 -0
  130. /kotonebot/kaa/sprites/{c14e3dd6-ffca-4011-b24d-da330162804d.png → ca680286-0937-46e1-8b4d-ee900baed756.png} +0 -0
  131. /kotonebot/kaa/sprites/{9d61082b-7e07-4da2-9210-5744a2481da4.png → ccb8054c-345d-43c9-8b2c-7b2243ad6668.png} +0 -0
  132. /kotonebot/kaa/sprites/{57c8fe6f-e970-4364-9359-9c273ca37b85.png → ccbbecec-5cf5-4f9f-8358-6b3408689234.png} +0 -0
  133. /kotonebot/kaa/sprites/{bde3bbca-be39-494f-944a-f73582cd5f97.png → cd8d48f2-77d2-4d0b-a81f-53a1549457e9.png} +0 -0
  134. /kotonebot/kaa/sprites/{76e3c1b4-cd2f-47f1-96bf-9b86a84aa24c.png → ceb4fae9-b5e5-41cf-856b-bcf753f477d9.png} +0 -0
  135. /kotonebot/kaa/sprites/{0450fdf0-f03d-4efc-b047-27532571c620.png → cf615078-aedf-46af-a94d-9328a16fbc13.png} +0 -0
  136. /kotonebot/kaa/sprites/{b7ee5425-c4ec-4030-9343-1737628b1936.png → cf8b2ae3-f948-4204-b7da-c0801f1368f4.png} +0 -0
  137. /kotonebot/kaa/sprites/{929d1dc7-6f9e-444b-9b57-ab8baacfe524.png → db86f5a5-0272-4a74-893e-077acbbecf23.png} +0 -0
  138. /kotonebot/kaa/sprites/{9cc5a374-ca08-4fa9-a2b7-e1f65871962d.png → dfe926f6-a3b3-48c2-9ebd-757f77d932a6.png} +0 -0
  139. /kotonebot/kaa/sprites/{63a3a9ca-aff2-428a-8df2-9a0ed4e398c6.png → e2a98bd2-56d1-47e9-806a-a36d06bd3f16.png} +0 -0
  140. /kotonebot/kaa/sprites/{22394de7-f95b-4001-a961-d854c34f1d8c.png → ecc2500b-4916-4c47-a840-98233d53522b.png} +0 -0
  141. /kotonebot/kaa/sprites/{70a0da32-7fe7-41a9-9fc1-265764a0b125.png → ed081194-272d-461a-93a1-ec476a896753.png} +0 -0
  142. /kotonebot/kaa/sprites/{1c0c3381-4d9b-4279-ac89-784b9e9d7e63.png → ef21cbe1-7263-4a68-ad8c-b9aac503978a.png} +0 -0
  143. /kotonebot/kaa/sprites/{c44a35b8-4254-4f4f-99a8-18a3195ae696.png → f0370809-4383-4039-b8ec-f80a9216a7b3.png} +0 -0
  144. /kotonebot/kaa/sprites/{39a5eb7d-0ece-4eca-bf0e-4bf2f8faf1e2.png → f47d8096-63bf-42ed-8f4f-5f6f1d8772f4.png} +0 -0
  145. /kotonebot/kaa/sprites/{14cd7285-f587-49af-9960-802c41050201.png → f60a8a24-b358-4f3a-af2c-4e4a31c5d36e.png} +0 -0
  146. /kotonebot/kaa/sprites/{b6da32be-5c6d-40a8-b1d0-15e0576c6f71.png → fa1eea22-b329-4c1c-8446-279c542f6da0.png} +0 -0
  147. /kotonebot/kaa/sprites/{d9b23b65-6780-446b-950c-48ca668f838a.png → fa72809a-d057-40a0-b771-f4d96bc1ced2.png} +0 -0
  148. /kotonebot/kaa/sprites/{73c270f5-055a-4cc3-9036-c95321faec4a.png → fb870576-1837-4267-bc0f-e0685bf7a136.png} +0 -0
  149. /kotonebot/kaa/sprites/{d76bed23-33cf-4f86-bb01-add1185098a1.png → fc7b1cdb-d0d0-4470-b5fd-218a8551dc9f.png} +0 -0
  150. /kotonebot/kaa/sprites/{ef8b7148-cc8f-4a76-a981-68062909e5a9.png → fcbeb870-6853-4e2c-8a6e-54b4787e3a2e.png} +0 -0
  151. /kotonebot/kaa/sprites/{c0adda90-8b05-4a6b-b091-9d2c9d4b84f8.png → fd354169-e32a-45be-9a1e-da0136b91dc3.png} +0 -0
  152. {ksaa-2025.8.2.0.dist-info → ksaa-2025.8.23.0.dist-info}/WHEEL +0 -0
  153. {ksaa-2025.8.2.0.dist-info → ksaa-2025.8.23.0.dist-info}/entry_points.txt +0 -0
  154. {ksaa-2025.8.2.0.dist-info → ksaa-2025.8.23.0.dist-info}/licenses/LICENSE +0 -0
  155. {ksaa-2025.8.2.0.dist-info → ksaa-2025.8.23.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,172 @@
1
+ import sys
2
+ import time
3
+ import logging
4
+ import threading
5
+ from contextlib import suppress
6
+ from typing import Callable, Optional
7
+
8
+ with suppress(ImportError):
9
+ keyboard = None
10
+ win32api = None
11
+ win32gui = None
12
+ win32con = None
13
+ import keyboard # type: ignore
14
+ import win32api # type: ignore
15
+ import win32gui # type: ignore
16
+ import win32con # type: ignore
17
+
18
+ from kotonebot.backend.context.context import vars
19
+ from kotonebot.kaa.config.schema import IdleModeConfig
20
+
21
+ logger = logging.getLogger(__name__)
22
+
23
+ def _get_system_idle_seconds_windows() -> int:
24
+ if win32api is None:
25
+ return 0
26
+ try:
27
+ last_input_tick = win32api.GetLastInputInfo()
28
+ tick_count = win32api.GetTickCount()
29
+ elapsed_ms = tick_count - last_input_tick
30
+ return max(0, int(elapsed_ms / 1000))
31
+ except Exception:
32
+ logger.exception('win32api.GetLastInputInfo failed')
33
+ return 0
34
+
35
+
36
+ def get_system_idle_seconds() -> int:
37
+ if sys.platform.startswith('win'):
38
+ try:
39
+ return _get_system_idle_seconds_windows()
40
+ except Exception:
41
+ logger.exception('GetLastInputInfo failed')
42
+ return 0
43
+ return 0
44
+
45
+
46
+ class IdleModeManager:
47
+ def __init__(
48
+ self,
49
+ *,
50
+ get_is_running: Callable[[], bool],
51
+ get_is_paused: Callable[[], bool],
52
+ get_config: Callable[[], IdleModeConfig],
53
+ ) -> None:
54
+ self._get_is_running = get_is_running
55
+ self._get_is_paused = get_is_paused
56
+ self._get_config = get_config
57
+ self._stop_event = threading.Event()
58
+ self._thread: Optional[threading.Thread] = None
59
+ self._keyboard_hook = None
60
+ self._last_key_ts: float = 0.0
61
+
62
+ def start(self) -> None:
63
+ if self._thread and self._thread.is_alive():
64
+ return
65
+ self._stop_event.clear()
66
+ self._thread = threading.Thread(target=self._loop, name='IdleModeThread', daemon=True)
67
+ self._thread.start()
68
+ self._install_keyboard_hook()
69
+ logger.info('IdleModeManager started')
70
+
71
+ def stop(self) -> None:
72
+ self._remove_keyboard_hook()
73
+ if self._thread and self._thread.is_alive():
74
+ self._stop_event.set()
75
+ self._thread.join(timeout=2.0)
76
+ logger.info('IdleModeManager stopped')
77
+
78
+ def notify_on_start(self) -> None:
79
+ # 运行态切换时可根据需要做重置
80
+ self._last_key_ts = 0.0
81
+
82
+ def notify_on_stop(self) -> None:
83
+ self._last_key_ts = 0.0
84
+
85
+ def _loop(self) -> None:
86
+ while not self._stop_event.is_set():
87
+ conf = self._get_config()
88
+ if not conf.enabled:
89
+ time.sleep(0.8)
90
+ continue
91
+ try:
92
+ if self._get_is_paused():
93
+ idle_sec = get_system_idle_seconds()
94
+ if idle_sec >= max(0, int(conf.idle_seconds)):
95
+ logger.info('System idle for %ss while paused. Requesting resume...', idle_sec)
96
+ try:
97
+ vars.flow.request_resume()
98
+ except Exception:
99
+ logger.exception('request_resume failed')
100
+ time.sleep(0.8)
101
+ except Exception:
102
+ logger.exception('IdleMode loop error')
103
+ time.sleep(1.0)
104
+
105
+ def _install_keyboard_hook(self) -> None:
106
+ if keyboard is None:
107
+ logger.warning('keyboard module not available; key-to-pause disabled')
108
+ return
109
+ if self._keyboard_hook is not None:
110
+ return
111
+
112
+ def _on_key_event(_: object) -> None:
113
+ conf = self._get_config()
114
+ if not conf.enabled:
115
+ return
116
+ now = time.time()
117
+ if (now - self._last_key_ts) < 0.3:
118
+ return
119
+ self._last_key_ts = now
120
+ try:
121
+ if self._get_is_running() and not self._get_is_paused():
122
+ logger.info('Any key pressed -> pause requested')
123
+ vars.flow.request_pause()
124
+ if conf.minimize_on_pause:
125
+ self._minimize_game_window()
126
+ except Exception:
127
+ logger.exception('key handler failed')
128
+
129
+ try:
130
+ self._keyboard_hook = keyboard.on_press(_on_key_event, suppress=False)
131
+ except Exception:
132
+ logger.warning('Failed to install keyboard hook; degraded behavior')
133
+ self._keyboard_hook = None
134
+
135
+ def _remove_keyboard_hook(self) -> None:
136
+ if keyboard is None:
137
+ return
138
+ if self._keyboard_hook is None:
139
+ return
140
+ try:
141
+ keyboard.unhook(self._keyboard_hook)
142
+ except Exception:
143
+ logger.exception('Failed to remove keyboard hook')
144
+ finally:
145
+ self._keyboard_hook = None
146
+
147
+ def _minimize_game_window(self) -> None:
148
+ # Send the window to background (bottom of Z-order) via pywin32
149
+ if not sys.platform.startswith('win'):
150
+ return
151
+ if win32gui is None or win32con is None:
152
+ logger.warning('pywin32 (win32gui/win32con) not available; skip backgrounding')
153
+ return
154
+ try:
155
+ hwnd = win32gui.FindWindow(None, 'gakumas') # type: ignore
156
+ if hwnd:
157
+ flags = (
158
+ win32con.SWP_NOMOVE
159
+ | win32con.SWP_NOSIZE
160
+ | win32con.SWP_NOACTIVATE
161
+ | win32con.SWP_NOOWNERZORDER
162
+ )
163
+ win32gui.SetWindowPos(hwnd, win32con.HWND_BOTTOM, 0, 0, 0, 0, flags)
164
+ try:
165
+ win32gui.ShowWindow(hwnd, win32con.SW_SHOWNOACTIVATE)
166
+ except Exception:
167
+ pass
168
+ logger.info('Sent game window to background (HWND=%s)', hwnd)
169
+ else:
170
+ logger.warning('Game window not found; cannot send to background')
171
+ except Exception:
172
+ logger.warning('Failed to send game window to background', exc_info=True)
@@ -14,6 +14,7 @@ from .schema import (
14
14
  StartGameConfig,
15
15
  EndGameConfig,
16
16
  MiscConfig,
17
+ IdleModeConfig,
17
18
  conf,
18
19
  )
19
20
  from .const import (
@@ -46,6 +47,7 @@ __all__ = [
46
47
  "StartGameConfig",
47
48
  "EndGameConfig",
48
49
  "MiscConfig",
50
+ "IdleModeConfig",
49
51
  "conf",
50
52
  # const 导出
51
53
  "ConfigEnum",
@@ -180,6 +180,14 @@ class MiscConfig(ConfigBaseModel):
180
180
  启用后,局域网内的其他设备可以通过本机 IP 地址访问 Web 界面。
181
181
  """
182
182
 
183
+ class IdleModeConfig(ConfigBaseModel):
184
+ enabled: bool = False
185
+ """是否启用闲置挂机(任意键暂停、闲置自动恢复)"""
186
+ idle_seconds: int = 30
187
+ """暂停状态下,超过该闲置秒数将自动恢复"""
188
+ minimize_on_pause: bool = True
189
+ """按键触发暂停时最小化游戏窗口"""
190
+
183
191
  class BaseConfig(ConfigBaseModel):
184
192
  purchase: PurchaseConfig = PurchaseConfig()
185
193
  """商店购买配置"""
@@ -223,6 +231,9 @@ class BaseConfig(ConfigBaseModel):
223
231
  misc: MiscConfig = MiscConfig()
224
232
  """杂项配置"""
225
233
 
234
+ idle: IdleModeConfig = IdleModeConfig()
235
+ """闲置挂机配置"""
236
+
226
237
 
227
238
  def conf() -> BaseConfig:
228
239
  """获取当前配置数据"""
kotonebot/kaa/main/gr.py CHANGED
@@ -28,9 +28,11 @@ from kotonebot.kaa.config import (
28
28
  PresentsConfig, AssignmentConfig, ContestConfig, ProduceConfig,
29
29
  MissionRewardConfig, DailyMoneyShopItems, ProduceAction,
30
30
  RecommendCardDetectionMode, TraceConfig, StartGameConfig, EndGameConfig, UpgradeSupportCardConfig, MiscConfig,
31
+ IdleModeConfig,
31
32
  )
32
33
  from kotonebot.kaa.config.produce import ProduceSolution, ProduceSolutionManager, ProduceData
33
34
  from kotonebot.kaa.application.adapter.misc_adapter import create_desktop_shortcut
35
+ from kotonebot.kaa.application.core.idle_mode import IdleModeManager
34
36
 
35
37
  logger = logging.getLogger(__name__)
36
38
  GradioInput = gr.Textbox | gr.Number | gr.Checkbox | gr.Dropdown | gr.Radio | gr.Slider | gr.Tabs | gr.Tab
@@ -91,6 +93,9 @@ ConfigKey = Literal[
91
93
  # misc
92
94
  'check_update', 'auto_install_update', 'expose_to_lan',
93
95
 
96
+ # idle
97
+ 'idle_enabled', 'idle_seconds', 'idle_minimize_on_pause',
98
+
94
99
  '_selected_backend_index'
95
100
 
96
101
  ]
@@ -228,6 +233,12 @@ class KotoneBotUI:
228
233
  self.is_single_task_stopping: bool = False # 新增:标记单个任务是否正在停止
229
234
  self._kaa = kaa
230
235
  self._load_config()
236
+ # 新增 IdleModeManager
237
+ self.idle_mgr = IdleModeManager(
238
+ get_is_running=lambda: (self.is_running or self.single_task_running) and not self.is_stopping and not self.is_single_task_stopping and not vars.flow.is_paused,
239
+ get_is_paused=lambda: vars.flow.is_paused,
240
+ get_config=lambda: self.current_config.options.idle,
241
+ )
231
242
  self._setup_kaa()
232
243
 
233
244
  def _setup_kaa(self) -> None:
@@ -322,6 +333,8 @@ class KotoneBotUI:
322
333
  def start_run(self) -> Tuple[str, List[List[str]]]:
323
334
  self.is_running = True
324
335
  self.run_status = self._kaa.start_all()
336
+ # 通知 Idle 管理器进入运行态
337
+ self.idle_mgr.notify_on_start()
325
338
  return "停止", self.update_task_status()
326
339
 
327
340
  def stop_run(self) -> Tuple[str, List[List[str]]]:
@@ -336,6 +349,8 @@ class KotoneBotUI:
336
349
  if self._kaa:
337
350
  self.run_status.interrupt()
338
351
  gr.Info("正在停止任务...")
352
+ # 通知 Idle 管理器停止态
353
+ self.idle_mgr.notify_on_stop()
339
354
 
340
355
  return "停止中...", self.update_task_status()
341
356
 
@@ -369,6 +384,8 @@ class KotoneBotUI:
369
384
  if hasattr(self, 'run_status') and self._kaa:
370
385
  self.run_status.interrupt()
371
386
  gr.Info("正在停止任务...")
387
+ # 通知 Idle 管理器停止态
388
+ self.idle_mgr.notify_on_stop()
372
389
  return "停止中...", "正在停止任务..."
373
390
 
374
391
  def toggle_pause(self) -> str:
@@ -881,7 +898,7 @@ class KotoneBotUI:
881
898
  new_value = choices[0]
882
899
  else:
883
900
  new_value = impl_value
884
- return gr.Dropdown(choices=choices, value=new_value)
901
+ return new_value
885
902
 
886
903
  with gr.Tabs(selected=self.current_config.backend.type):
887
904
  with gr.Tab("MuMu 12", id="mumu12") as tab_mumu12:
@@ -1405,12 +1422,6 @@ class KotoneBotUI:
1405
1422
  info="进行一次 REGULAR 培育需要 ~30min,进行一次 PRO 培育需要 ~1h(具体视设备性能而定)。",
1406
1423
  visible=False
1407
1424
  )
1408
- produce_count = gr.Number(
1409
- minimum=1,
1410
- label="培育次数",
1411
- info="培育的次数。",
1412
- visible=False
1413
- )
1414
1425
 
1415
1426
  # 添加偶像选择
1416
1427
  idol_choices = []
@@ -1526,13 +1537,6 @@ class KotoneBotUI:
1526
1537
  label="培育模式",
1527
1538
  info="进行一次 REGULAR 培育需要 ~30min,进行一次 PRO 培育需要 ~1h(具体视设备性能而定)。"
1528
1539
  )
1529
- produce_count = gr.Number(
1530
- minimum=1,
1531
- value=self.current_config.options.produce.produce_count,
1532
- label="培育次数",
1533
- interactive=True,
1534
- info="培育的次数。"
1535
- )
1536
1540
 
1537
1541
  # 添加偶像选择
1538
1542
  idol_choices = []
@@ -1566,7 +1570,7 @@ class KotoneBotUI:
1566
1570
 
1567
1571
  with gr.Group(visible=not current_solution.data.auto_set_memory) as memory_sets_group:
1568
1572
  memory_sets = gr.Dropdown(
1569
- choices=[str(i) for i in range(1, 11)], # 假设最多10个编成位
1573
+ choices=[str(i) for i in range(1, 21)], # 最多20个编成位
1570
1574
  value=str(current_solution.data.memory_set) if current_solution.data.memory_set else None,
1571
1575
  label="回忆编成编号",
1572
1576
  multiselect=False,
@@ -1582,7 +1586,7 @@ class KotoneBotUI:
1582
1586
 
1583
1587
  with gr.Group(visible=not current_solution.data.auto_set_support_card) as support_card_sets_group:
1584
1588
  support_card_sets = gr.Dropdown(
1585
- choices=[str(i) for i in range(1, 11)], # 假设最多10个编成位
1589
+ choices=[str(i) for i in range(1, 21)], # 最多20个编成位
1586
1590
  value=str(current_solution.data.support_card_set) if current_solution.data.support_card_set else None,
1587
1591
  label="支援卡编成编号",
1588
1592
  multiselect=False,
@@ -1663,7 +1667,6 @@ class KotoneBotUI:
1663
1667
  gr.Textbox(value="", visible=False), # solution_name
1664
1668
  gr.Textbox(value="", visible=False), # solution_description
1665
1669
  gr.Dropdown(visible=False), # produce_mode
1666
- gr.Number(visible=False), # produce_count
1667
1670
  gr.Dropdown(visible=False), # produce_idols
1668
1671
  gr.Markdown(visible=False), # kotone_warning
1669
1672
  gr.Checkbox(visible=False), # auto_set_memory
@@ -1693,7 +1696,6 @@ class KotoneBotUI:
1693
1696
  gr.Textbox(value=solution.name, visible=True),
1694
1697
  gr.Textbox(value=solution.description or "", visible=True),
1695
1698
  gr.Dropdown(value=solution.data.mode, visible=True),
1696
- gr.Number(value=self.current_config.options.produce.produce_count, visible=True),
1697
1699
  gr.Dropdown(value=solution.data.idol, visible=True),
1698
1700
  gr.Markdown(visible=has_kotone and not is_strict_mode),
1699
1701
  gr.Checkbox(value=solution.data.auto_set_memory, visible=True),
@@ -1789,7 +1791,7 @@ class KotoneBotUI:
1789
1791
  else:
1790
1792
  return gr.Dropdown()
1791
1793
 
1792
- def on_save_solution(solution_id, name, description, mode, count, idols, auto_memory, memory_sets,
1794
+ def on_save_solution(solution_id, name, description, mode, idols, auto_memory, memory_sets,
1793
1795
  auto_support, support_card_sets, pt_boost, note_boost, follow_producer, study_lesson, prefer_ap,
1794
1796
  actions, detection_mode, ap_drink, skip_commu_val):
1795
1797
  """保存培育方案"""
@@ -1831,9 +1833,6 @@ class KotoneBotUI:
1831
1833
  # 保存方案
1832
1834
  solution_manager.save(solution_id, solution)
1833
1835
 
1834
- # 同时更新配置中的 produce_count
1835
- self.current_config.options.produce.produce_count = int(count)
1836
-
1837
1836
  # 重新列出所有方案(确保没有重复项)
1838
1837
  solutions = solution_manager.list()
1839
1838
  solution_choices = [(f"{sol.name} - {sol.description or '无描述'}", sol.id) for sol in solutions]
@@ -1884,7 +1883,7 @@ class KotoneBotUI:
1884
1883
  inputs=[solution_dropdown],
1885
1884
  outputs=[
1886
1885
  solution_name, solution_description,
1887
- produce_mode, produce_count, produce_idols, kotone_warning,
1886
+ produce_mode, produce_idols, kotone_warning,
1888
1887
  auto_set_memory, memory_sets_group, memory_sets,
1889
1888
  auto_set_support, support_card_sets_group, support_card_sets,
1890
1889
  use_pt_boost, use_note_boost, follow_producer,
@@ -1920,7 +1919,7 @@ class KotoneBotUI:
1920
1919
  fn=on_save_solution,
1921
1920
  inputs=[
1922
1921
  solution_dropdown, solution_name, solution_description,
1923
- produce_mode, produce_count, produce_idols,
1922
+ produce_mode, produce_idols,
1924
1923
  auto_set_memory, memory_sets, auto_set_support, support_card_sets,
1925
1924
  use_pt_boost, use_note_boost, follow_producer,
1926
1925
  self_study_lesson, prefer_lesson_ap, actions_order,
@@ -2271,6 +2270,42 @@ class KotoneBotUI:
2271
2270
  create_desktop_shortcut(start_immediately)
2272
2271
  gr.Success("快捷方式创建成功")
2273
2272
  return _inner
2273
+
2274
+ def _create_idle_settings(self) -> ConfigBuilderReturnValue:
2275
+ with gr.Column():
2276
+ gr.Markdown("### 闲置挂机")
2277
+ idle_enabled = gr.Checkbox(
2278
+ label="启用闲置挂机(任意键暂停、闲置自动恢复)",
2279
+ value=self.current_config.options.idle.enabled,
2280
+ info=IdleModeConfig.model_fields['enabled'].description,
2281
+ interactive=True
2282
+ )
2283
+ idle_seconds = gr.Slider(
2284
+ label="自动恢复触发时间(秒)",
2285
+ minimum=30,
2286
+ maximum=3600,
2287
+ step=10,
2288
+ value=self.current_config.options.idle.idle_seconds,
2289
+ info=IdleModeConfig.model_fields['idle_seconds'].description,
2290
+ interactive=True
2291
+ )
2292
+ idle_minimize_on_pause = gr.Checkbox(
2293
+ label="暂停时最小化游戏窗口",
2294
+ value=self.current_config.options.idle.minimize_on_pause,
2295
+ info=IdleModeConfig.model_fields['minimize_on_pause'].description,
2296
+ interactive=True
2297
+ )
2298
+
2299
+ def set_config(config: BaseConfig, data: dict[ConfigKey, Any]) -> None:
2300
+ config.idle.enabled = data['idle_enabled']
2301
+ config.idle.idle_seconds = int(data['idle_seconds'])
2302
+ config.idle.minimize_on_pause = data['idle_minimize_on_pause']
2303
+
2304
+ return set_config, {
2305
+ 'idle_enabled': idle_enabled,
2306
+ 'idle_seconds': idle_seconds,
2307
+ 'idle_minimize_on_pause': idle_minimize_on_pause,
2308
+ }
2274
2309
 
2275
2310
  def _create_debug_settings(self) -> ConfigBuilderReturnValue:
2276
2311
  """调试设置:仅在调试时使用"""
@@ -2305,7 +2340,7 @@ class KotoneBotUI:
2305
2340
 
2306
2341
  def _create_settings_tab(self) -> None:
2307
2342
  with gr.Tab("设置"):
2308
- gr.Markdown("## 设置")
2343
+ gr.Markdown("## 设置 <span style='color: red; font-size: 0.8rem; font-weight: normal;'>设置修改后需要保存(网页底部)才会生效!</span>")
2309
2344
 
2310
2345
  # 模拟器设置
2311
2346
  emulator_settings = self._create_emulator_settings()
@@ -2346,6 +2381,9 @@ class KotoneBotUI:
2346
2381
  # 杂项设置
2347
2382
  misc_settings = self._create_misc_settings()
2348
2383
 
2384
+ # 闲置挂机设置
2385
+ idle_settings = self._create_idle_settings()
2386
+
2349
2387
  # 调试设置(放在最后)
2350
2388
  debug_settings = self._create_debug_settings()
2351
2389
 
@@ -2367,6 +2405,7 @@ class KotoneBotUI:
2367
2405
  start_game_settings,
2368
2406
  end_game_settings,
2369
2407
  misc_settings,
2408
+ idle_settings,
2370
2409
  debug_settings
2371
2410
  ] # list of (set_func, { 'key': component, ... })
2372
2411
  all_components = [list(ret[1].values()) for ret in all_return_values] # [[c1, c2], [c3], ...]
@@ -2668,6 +2707,7 @@ class KotoneBotUI:
2668
2707
  self.config.user_configs.append(default_config)
2669
2708
  self.current_config = self.config.user_configs[0]
2670
2709
 
2710
+
2671
2711
  def create_ui(self) -> gr.Blocks:
2672
2712
  custom_css = """
2673
2713
  #container { max-width: 800px; margin: auto; padding: 20px; }
@@ -2695,6 +2735,9 @@ class KotoneBotUI:
2695
2735
  self._create_whats_new_tab()
2696
2736
  self._create_screen_tab()
2697
2737
 
2738
+ # 启动 IdleModeManager 后台线程
2739
+ self.idle_mgr.start()
2740
+
2698
2741
  return app
2699
2742
 
2700
2743
  def main(kaa: Kaa | None = None, start_immidiately: bool = False) -> None:
kotonebot/kaa/metadata.py CHANGED
@@ -1,6 +1,29 @@
1
1
  WHATS_NEW = """
2
2
  # 更新日志
3
3
  ## kaa
4
+ ### v2025.8.23.0
5
+ 脚本:
6
+ * [新增] 新增闲置挂机功能(#54e2101)
7
+ * [修复] 再次修复商店刷新后第二次购买会跳过第一行的问题(#b72cdf4)
8
+ * [修复] 修复游戏更新导致的培育时识别编成编号失败(#24d14d4)
9
+ * [修复] 修复培育内周数识别失败的问题(#3a84994)
10
+ * [修复] 培育商店中有时候会因为结束按钮被挡住而卡住(#e93cfa8)
11
+
12
+ 其他:
13
+ * [文档] 更新 README(#841fcf2)
14
+
15
+ ### v2025.8.17.0
16
+ 脚本:
17
+ * [修复] 尝试修复进入每日商店时报错的问题(#e9529b7)
18
+ * [修复] 修复刷新商店商品时脚本不会等待刷新完成的问题(#180d800)
19
+ * [修复] 修复商店刷新后第二次购买会跳过第一行的问题 #59(#a327791)
20
+ * [修复] 修复金币商店购买一个物品总是点击两次的问题(#94a264e)
21
+
22
+ 界面:
23
+ * [修复] 移除模拟器设置的最后多余的 Dropdown(#91d05b1)
24
+ * [修复] 移除培育方案中多余的培育次数输入框(#c0549d9)
25
+ * [新增] 新增保存设置提示(#b56eabc)
26
+
4
27
  ### v2025.8.2.0
5
28
  脚本:
6
29
  * [修复] 修复 DMM 版启动游戏提示找不到窗口的问题(#46e72c4)
Binary file
Binary file