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.
- kotonebot/backend/loop.py +276 -276
- kotonebot/kaa/application/core/idle_mode.py +172 -0
- kotonebot/kaa/config/__init__.py +2 -0
- kotonebot/kaa/config/schema.py +11 -0
- kotonebot/kaa/main/gr.py +68 -25
- kotonebot/kaa/metadata.py +23 -0
- kotonebot/kaa/resources/__pycache__/__init__.cpython-310.pyc +0 -0
- kotonebot/kaa/resources/game.db +0 -0
- kotonebot/kaa/resources/game_ver.txt +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-fktn-3-013_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-fktn-3-013_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hmsz-3-002_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-hmsz-3-002_1.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-jsna-3-008_0.png +0 -0
- kotonebot/kaa/resources/idol_cards/i_card-skin-jsna-3-008_1.png +0 -0
- kotonebot/kaa/sprites/70898bf8-56c5-4f84-becb-629c9ab6a7da.png +0 -0
- kotonebot/kaa/sprites/9fd0753f-c607-4d49-82d1-40bda27e014f.png +0 -0
- kotonebot/kaa/sprites/a48324ae-7c1a-489e-b3c4-93d12267f88d.png +0 -0
- kotonebot/kaa/sprites/ce20a856-5629-4f8e-a8e1-d1bd14e18e4f.png +0 -0
- kotonebot/kaa/tasks/R.py +131 -127
- kotonebot/kaa/tasks/daily/purchase.py +10 -5
- kotonebot/kaa/tasks/produce/in_purodyuusu.py +3 -3
- kotonebot/kaa/tasks/produce/produce.py +3 -3
- {ksaa-2025.8.2.0.dist-info → ksaa-2025.8.23.0.dist-info}/METADATA +89 -89
- {ksaa-2025.8.2.0.dist-info → ksaa-2025.8.23.0.dist-info}/RECORD +155 -146
- /kotonebot/kaa/sprites/{6b2bd35a-d399-4486-b4ef-24abb3e6669f.png → 00707545-6ed3-4c3a-9c84-89cb75ac1adc.png} +0 -0
- /kotonebot/kaa/sprites/{d2bce7a9-8709-4042-a31a-1f07b2711637.png → 03985ce5-781f-4c1b-8d49-c5f97010d5ff.png} +0 -0
- /kotonebot/kaa/sprites/{77c9d69b-1078-477f-897f-c50bc5013fd5.png → 04622143-7f9e-47a8-86a5-be2b81d13cb6.png} +0 -0
- /kotonebot/kaa/sprites/{ee191a7a-ed3e-46e2-a07a-2ca7d566d0f6.png → 04b33e1f-a341-46d4-a54b-a05f1e765c10.png} +0 -0
- /kotonebot/kaa/sprites/{c2841576-352b-41de-95d8-3f2640504c9c.png → 06df0c16-bb7e-41b7-90fe-afc14379b90f.png} +0 -0
- /kotonebot/kaa/sprites/{1ec343a7-f6d4-4ab5-967b-66f900438977.png → 08f593a9-d9eb-41ee-b2c0-010562e7ef10.png} +0 -0
- /kotonebot/kaa/sprites/{cde81597-2e0a-4795-910a-6e475d7cc073.png → 0bd59a8f-6fbd-4c92-8c1e-1d58716b6d84.png} +0 -0
- /kotonebot/kaa/sprites/{66cc412b-a4a1-4b42-89b4-7653eef41204.png → 0e332904-cace-4d02-9575-100a359c548f.png} +0 -0
- /kotonebot/kaa/sprites/{2d59f524-840a-445f-b432-c97051eb7043.png → 1262d83a-8f2a-4f75-b70a-385a04d35ae1.png} +0 -0
- /kotonebot/kaa/sprites/{8fb0f6d1-388b-41b3-964b-5965c58605c7.png → 12f47930-f691-4a3e-8c83-e47f63fb1f2b.png} +0 -0
- /kotonebot/kaa/sprites/{7c6dd46a-62ff-4d2c-b04a-df97ba55ed74.png → 146c742a-0fb3-4d88-851e-ddd621533ad3.png} +0 -0
- /kotonebot/kaa/sprites/{b144b5df-c3b5-4bda-bb3d-9c8fa1182080.png → 1a06449d-472e-4c06-9dc1-1cb06b1b1ce5.png} +0 -0
- /kotonebot/kaa/sprites/{9fa1e59d-36cb-43c9-a788-ed95ae93f3d0.png → 1b60b852-dc93-48a1-8b73-0d728d04e057.png} +0 -0
- /kotonebot/kaa/sprites/{6770f2b1-1619-4937-bf8d-284b90a5d3c6.png → 1dd337ca-20f1-4dc6-8254-235d7ec74158.png} +0 -0
- /kotonebot/kaa/sprites/{2b225eb3-c1b2-415a-99de-1a41a0ed4470.png → 1e17f7b1-4f64-474c-aade-4b3de32c0de4.png} +0 -0
- /kotonebot/kaa/sprites/{785837db-1da3-46d0-866f-017c232547ad.png → 2227a4ac-a933-4165-b594-2720a26f9e44.png} +0 -0
- /kotonebot/kaa/sprites/{58f1212f-a307-4179-a55c-8449e237cb3d.png → 229366ae-dbcd-4378-84a2-8a7eb1d1e084.png} +0 -0
- /kotonebot/kaa/sprites/{ddb5b885-93de-49d1-8150-3235d702c1c8.png → 25ceaa36-a432-4bf3-80b7-11c94cd82357.png} +0 -0
- /kotonebot/kaa/sprites/{72ea8e77-8773-47bf-9c5f-bf51812065cd.png → 276239b5-e41b-4ae5-9be6-37d251292d39.png} +0 -0
- /kotonebot/kaa/sprites/{5da76978-7dc4-4d4e-8e4c-e3189e2c2b07.png → 288a0541-a175-47b4-b75c-2e845e27cba6.png} +0 -0
- /kotonebot/kaa/sprites/{9552c822-a654-46a8-acd9-0320a4b6118b.png → 29449202-a6cc-4080-bb87-816481ec9506.png} +0 -0
- /kotonebot/kaa/sprites/{d7c2d507-640e-4705-92d0-d2e3951cc29b.png → 2ee5d498-1370-4f09-b187-41dbe582f498.png} +0 -0
- /kotonebot/kaa/sprites/{74d02db5-a02d-43d0-ae7a-5aeba90249be.png → 2fa084f5-0637-4d53-ada8-9c542d597a51.png} +0 -0
- /kotonebot/kaa/sprites/{9169b74f-7458-4562-bc90-41efe0edfc22.png → 2fc0a912-8d9b-48a3-b942-a25274c83edd.png} +0 -0
- /kotonebot/kaa/sprites/{c2d305cc-8fb4-4f34-a9b3-96862837a36b.png → 30ce2e03-e9b3-4b4f-aded-51a05bfca91f.png} +0 -0
- /kotonebot/kaa/sprites/{9cf406dc-bd69-4919-a396-d7e267b01645.png → 359d6d34-ea55-470b-b682-6c9252953e8d.png} +0 -0
- /kotonebot/kaa/sprites/{8cd02d5b-96f7-4b59-8676-ca07a63a7693.png → 35f613e8-61af-41b0-a397-44ae7566a233.png} +0 -0
- /kotonebot/kaa/sprites/{a9c016ed-463b-4e06-88ce-020c2b4dd981.png → 36039a1a-52e6-428d-9866-0f0f65a7298f.png} +0 -0
- /kotonebot/kaa/sprites/{203dfb12-640e-4437-9040-47045c9b8cbd.png → 3675c4aa-a208-47d1-bbcb-48bce40e6ae9.png} +0 -0
- /kotonebot/kaa/sprites/{e97c5043-a73e-4979-a529-34b4daaee88d.png → 3746df74-fe63-442c-85d2-8a3696cb2fcd.png} +0 -0
- /kotonebot/kaa/sprites/{d3a1c862-8f02-4aca-8b58-bbd337ab48bf.png → 382cb218-9e58-406f-9a3b-a9d990fc0fff.png} +0 -0
- /kotonebot/kaa/sprites/{88e9493c-0914-489a-9d99-addff4f0efd0.png → 3997a0e3-0826-4b1e-b7e9-4a36ebaaa9e8.png} +0 -0
- /kotonebot/kaa/sprites/{4a395a76-b1b6-4541-97b0-2e2603d47360.png → 3a41fe06-7f33-4c21-9edd-291191e3c563.png} +0 -0
- /kotonebot/kaa/sprites/{2a317f0e-613e-48c4-9def-d18a3b834254.png → 40fc17b0-718c-432d-b784-92a22c2f7512.png} +0 -0
- /kotonebot/kaa/sprites/{d400ab2d-b4dc-43bb-bb77-f49c666bf4b1.png → 45abba60-06d7-4921-b2a2-9ce790c2b25b.png} +0 -0
- /kotonebot/kaa/sprites/{9dc6ec60-597c-4305-b251-2e3342603446.png → 47d9fac4-2caf-4479-a97a-e519ddbfb3cf.png} +0 -0
- /kotonebot/kaa/sprites/{c85ba9aa-9ff1-42a4-b80a-ef39ab009e85.png → 4d0f75f5-632b-4c59-88a5-058622a4c3af.png} +0 -0
- /kotonebot/kaa/sprites/{d6182579-dc5d-4db9-a8be-0a7f3998abde.png → 4f2fcec7-399e-4184-b1dc-eabae92d63dd.png} +0 -0
- /kotonebot/kaa/sprites/{343d630f-375f-496a-98c5-75a1e0aa2c2c.png → 4fd7d95e-7955-4a70-ad91-67a230c647a3.png} +0 -0
- /kotonebot/kaa/sprites/{fbea0ab6-3094-438e-807d-5a24d0d32cf3.png → 54e29f7f-c951-46a2-a068-6911dfcf1966.png} +0 -0
- /kotonebot/kaa/sprites/{b28eac50-4517-4fc3-8fd9-a6a7f8d19ba5.png → 5528a0a0-2f1e-41f8-b55f-a565a2f80908.png} +0 -0
- /kotonebot/kaa/sprites/{1564ee9a-c2eb-4284-b22a-dd8df7c8a32f.png → 57cee3e6-eee4-4023-85f3-52959fa372a0.png} +0 -0
- /kotonebot/kaa/sprites/{5bf54b6d-d2b6-4211-b3f4-0713b84dd315.png → 5b2e7826-0e1c-4fd8-965c-6a3498c59825.png} +0 -0
- /kotonebot/kaa/sprites/{727c2d86-0daf-47d3-8eb4-500e648abfd6.png → 5cd3481b-2388-4461-b525-c2f78050822f.png} +0 -0
- /kotonebot/kaa/sprites/{d1b23182-244c-4e94-ac46-894b3117d1bb.png → 5fb7c821-63b4-4ee2-b6ea-16eec3a77251.png} +0 -0
- /kotonebot/kaa/sprites/{5c2e3a85-838c-41d5-b55e-b62fc1b95a1e.png → 5fb96a83-7b37-435b-9d7e-9caf0bc022e4.png} +0 -0
- /kotonebot/kaa/sprites/{92d4209d-5053-4284-a9f5-63372c8cd05b.png → 62676c2c-814a-4d8b-9bb2-232c3b434287.png} +0 -0
- /kotonebot/kaa/sprites/{248f9401-c340-474f-baed-1a523f441f3e.png → 651b2464-0c4a-4f3d-9452-5a40897b39e1.png} +0 -0
- /kotonebot/kaa/sprites/{9713c534-6f51-45c7-a03c-1acb642c519c.png → 658eb246-1469-4a86-b7a7-5e66b3102084.png} +0 -0
- /kotonebot/kaa/sprites/{1193a4e3-4d0d-4433-97ce-b19aeb6846c5.png → 65dbaa8c-2053-4441-9c31-8fd8fc8c87d8.png} +0 -0
- /kotonebot/kaa/sprites/{8fc97425-3b86-42cd-820d-2ad6321508f3.png → 67da7040-7183-4d30-89a7-e78345f42948.png} +0 -0
- /kotonebot/kaa/sprites/{74423820-b24e-4dd1-b6c4-7ef3d6aa3b8c.png → 6a272201-1311-41ee-b296-0a8d812d8173.png} +0 -0
- /kotonebot/kaa/sprites/{a9e90b22-4415-44cf-bf2f-6acb2733312f.png → 6a59aafc-4962-490e-8ab1-9ad59d22db3d.png} +0 -0
- /kotonebot/kaa/sprites/{52e0b7fe-271f-4713-b1b3-b06a286630d7.png → 6aa1fbb0-3880-49e1-ade3-29f627d0e38b.png} +0 -0
- /kotonebot/kaa/sprites/{ab39be69-bf52-4250-8e38-25b04d1e6a87.png → 6bb37f56-bac2-4852-82b0-e9b65ce0cbe8.png} +0 -0
- /kotonebot/kaa/sprites/{de804900-3470-478e-a51f-e3919b301326.png → 6d58dbfa-84e2-4a84-8c7c-133e459e9b40.png} +0 -0
- /kotonebot/kaa/sprites/{50ca8582-8787-45ff-a6b6-e1f0e8b44cb5.png → 71e84fb3-9474-4bbc-8543-ffba5758dcc0.png} +0 -0
- /kotonebot/kaa/sprites/{01e8e85e-056c-4428-9cb2-4024c4e6d022.png → 72a9238a-de6d-4665-85d4-265180d00db2.png} +0 -0
- /kotonebot/kaa/sprites/{891d4f63-df7f-462c-8908-ff4380c91b8b.png → 7533e4fd-e411-4386-a0fb-aa8f2cbeb216.png} +0 -0
- /kotonebot/kaa/sprites/{c673c1f3-2ac5-4fef-a9a2-203e67e1fd10.png → 77b0a64c-1e14-41d6-94af-8824982f2119.png} +0 -0
- /kotonebot/kaa/sprites/{b1c80e35-8949-4425-8b96-1df803cacde5.png → 78e27204-2544-419d-b66e-e9e7244f4460.png} +0 -0
- /kotonebot/kaa/sprites/{5b94cf27-4aa0-4de1-a9f2-ba8f5ca790fd.png → 791e885e-6e27-498f-81ff-87a40582507d.png} +0 -0
- /kotonebot/kaa/sprites/{327733fe-e68a-4f96-9e42-2b16629cbf8a.png → 795961a5-78c5-4ac4-a250-b1879cd2f60d.png} +0 -0
- /kotonebot/kaa/sprites/{190c0a4a-24c2-4717-8a78-ffa7bb0366d2.png → 7a54f094-bc75-48d3-8253-cca80a7052a2.png} +0 -0
- /kotonebot/kaa/sprites/{065cbac0-e09a-4bec-aa10-5fdb41720d31.png → 7b8541a8-9e82-410b-b053-3ebc96b36604.png} +0 -0
- /kotonebot/kaa/sprites/{9acad6e8-8380-47c9-bac8-3144c9b7b765.png → 7eff6c59-a7ed-43d5-8b67-083127e9e748.png} +0 -0
- /kotonebot/kaa/sprites/{644a3f8a-6b32-4c3e-9701-acb426502f81.png → 7ff80aa1-94c3-417e-9fae-3c2f2b8036a8.png} +0 -0
- /kotonebot/kaa/sprites/{b7bd78a1-aa4a-4847-8e9a-969989ef3cb3.png → 80ae6f18-cc26-4b31-9202-b5a0656b23ce.png} +0 -0
- /kotonebot/kaa/sprites/{876ec159-fc25-4c97-9c37-e3ffaba7618b.png → 80fac9c6-e6de-4fb5-9543-77797ffcde7a.png} +0 -0
- /kotonebot/kaa/sprites/{ddc4b13a-4a0f-46fd-8fcb-01100058f78a.png → 833ce8cb-01cd-4457-94b9-ff3f93d33f05.png} +0 -0
- /kotonebot/kaa/sprites/{df11deb8-940d-45a3-89b7-48c814735448.png → 8a62a66d-4b66-42d5-b004-b56eb7c45d68.png} +0 -0
- /kotonebot/kaa/sprites/{c75bba52-b3a5-4565-bb45-104ebed9e3d2.png → 8b3cfcfc-fa00-4bc5-9ea4-b350f2c08cb0.png} +0 -0
- /kotonebot/kaa/sprites/{fe9a7ad5-4506-4dfe-80a5-6f4bb9703f9c.png → 8bad2dbc-9f3a-443f-a3ff-048e70577a97.png} +0 -0
- /kotonebot/kaa/sprites/{96b9b3cb-7131-46ba-a193-f46446f72194.png → 8bdcc43b-876d-451f-b300-67c16c6f5c9f.png} +0 -0
- /kotonebot/kaa/sprites/{9f8332c7-95b4-41ec-8e7f-f5ece0a545e1.png → 8c9c9195-4eed-407c-b1ab-bb616c7b2acc.png} +0 -0
- /kotonebot/kaa/sprites/{180b211b-3b77-43a9-b550-6624f1b1beb1.png → 94165d54-2c09-427f-9cb1-e23fa9b06a96.png} +0 -0
- /kotonebot/kaa/sprites/{5ac654b1-f891-46b4-a4b2-3b8f9a60a02b.png → 98deb79d-e32b-4551-bc26-c4722d2b1307.png} +0 -0
- /kotonebot/kaa/sprites/{5f1e618b-a1fc-41c6-9b05-f2a76c38feb5.png → 9a816f64-b16e-4e8a-b4d8-d056c31c85f1.png} +0 -0
- /kotonebot/kaa/sprites/{39ab37d4-2654-4102-ba75-17d6bbd79673.png → 9b0f6620-5fd0-4393-ae67-555baf171550.png} +0 -0
- /kotonebot/kaa/sprites/{3fa41725-c619-4ed8-811c-c6f0e9366126.png → 9d9dd078-9bb3-4f5f-9ef5-63c203bf02c9.png} +0 -0
- /kotonebot/kaa/sprites/{43c175e2-7e7e-405a-8c92-0cf3d7400d12.png → 9e5afe22-f817-45f7-b0dd-2c808adff8cb.png} +0 -0
- /kotonebot/kaa/sprites/{cd1f5c42-582e-408e-bb9f-08f7b868d9fc.png → 9f41a6b4-2955-4105-8610-423f267807de.png} +0 -0
- /kotonebot/kaa/sprites/{969ddfa4-c0c8-41c8-b51b-40febf152c7a.png → 9fb0f700-1eaf-4677-bd1f-05f9f311cdfc.png} +0 -0
- /kotonebot/kaa/sprites/{133ea490-fefe-4785-b531-3cc7072338da.png → a04c4402-e071-401a-9549-d573eabc0e59.png} +0 -0
- /kotonebot/kaa/sprites/{ab823208-66f4-4a97-836b-024bf27b7c74.png → a18a08f5-c752-4fa4-a451-b48f5ca11360.png} +0 -0
- /kotonebot/kaa/sprites/{19060076-f971-411c-9b1b-f22e18871b74.png → a1bae28b-7b90-4009-b384-79f7a8974078.png} +0 -0
- /kotonebot/kaa/sprites/{aec4ecf4-c1d7-424f-8acc-388ff286a360.png → a4935638-882c-4d3f-af77-e5888ad0b71e.png} +0 -0
- /kotonebot/kaa/sprites/{6006a923-8f9b-4dfc-aa81-1e4672db6908.png → a898c01d-1347-484f-b2b0-10858a1ef3a6.png} +0 -0
- /kotonebot/kaa/sprites/{3ac2cb20-6563-4505-85bc-1fd3b93902a3.png → a921b8d5-93b7-4346-9ae4-d2e1def1ec1a.png} +0 -0
- /kotonebot/kaa/sprites/{356f4aa8-ebc5-4edc-9724-badf6d02d61e.png → a975a75e-e774-481b-8ade-9b1229bc95dd.png} +0 -0
- /kotonebot/kaa/sprites/{a5a16fb6-5513-4e17-b871-968425bfdf81.png → ad455e8e-fb2f-4180-af29-7ef66c98daa9.png} +0 -0
- /kotonebot/kaa/sprites/{cfd353f0-073f-462e-928b-3cda9344eec4.png → ae1a5e05-d53d-43aa-9f27-b9117483d19e.png} +0 -0
- /kotonebot/kaa/sprites/{f2b30fe6-1a32-4f0f-98c1-478e90db1f1b.png → aeff3068-5f5c-4685-a328-fe367d426c46.png} +0 -0
- /kotonebot/kaa/sprites/{0300702d-1023-4af7-9fee-54c058f7f1a8.png → b5a883c1-8086-4c60-a789-a7819c674645.png} +0 -0
- /kotonebot/kaa/sprites/{9acf0817-ab1f-45e1-a26f-99c3c331a184.png → b5ecb8e2-8b1a-4240-a2c9-152ccecdacbe.png} +0 -0
- /kotonebot/kaa/sprites/{58cbe76f-7cab-490d-8668-1076e76d9e9f.png → b6cda449-d5ab-4a38-9c85-c25e1b73f588.png} +0 -0
- /kotonebot/kaa/sprites/{9ce465b3-b4a6-4646-a559-3088621a1da1.png → b9e687ca-ba44-4aa1-a282-b7da6cffb2ba.png} +0 -0
- /kotonebot/kaa/sprites/{9a3c04af-7ba4-4520-a666-3045c1b3385c.png → bc393fa9-317c-48f9-88cf-cd4d93af1569.png} +0 -0
- /kotonebot/kaa/sprites/{ab52b70e-ca1f-47fe-aff8-0bfae7eeb8ff.png → bdc3b84b-18a4-4abe-938d-3e6495bef7eb.png} +0 -0
- /kotonebot/kaa/sprites/{c447f3cf-05b3-413d-9a50-f09a22b17e8d.png → bfa4b6bf-c032-46b8-9ce3-268717e4e364.png} +0 -0
- /kotonebot/kaa/sprites/{ed84a435-c52c-4294-ad80-bf3c63e2878d.png → c1504a57-77f0-46ca-a30b-162120489d5c.png} +0 -0
- /kotonebot/kaa/sprites/{1935d9dc-84ff-47a8-a65b-a458a224b4cc.png → c3d5a935-6e77-4751-a0b1-b1ac3a3edf0a.png} +0 -0
- /kotonebot/kaa/sprites/{44d9cfe6-742c-46de-8f53-4f49babfabcc.png → c86250ac-bde0-45bb-b696-f8b94e2d2d3b.png} +0 -0
- /kotonebot/kaa/sprites/{55e853dd-07bc-4086-8a2d-60d24ff75839.png → c89ce004-a437-4b94-9420-0d9bf2ed7e25.png} +0 -0
- /kotonebot/kaa/sprites/{c14e3dd6-ffca-4011-b24d-da330162804d.png → ca680286-0937-46e1-8b4d-ee900baed756.png} +0 -0
- /kotonebot/kaa/sprites/{9d61082b-7e07-4da2-9210-5744a2481da4.png → ccb8054c-345d-43c9-8b2c-7b2243ad6668.png} +0 -0
- /kotonebot/kaa/sprites/{57c8fe6f-e970-4364-9359-9c273ca37b85.png → ccbbecec-5cf5-4f9f-8358-6b3408689234.png} +0 -0
- /kotonebot/kaa/sprites/{bde3bbca-be39-494f-944a-f73582cd5f97.png → cd8d48f2-77d2-4d0b-a81f-53a1549457e9.png} +0 -0
- /kotonebot/kaa/sprites/{76e3c1b4-cd2f-47f1-96bf-9b86a84aa24c.png → ceb4fae9-b5e5-41cf-856b-bcf753f477d9.png} +0 -0
- /kotonebot/kaa/sprites/{0450fdf0-f03d-4efc-b047-27532571c620.png → cf615078-aedf-46af-a94d-9328a16fbc13.png} +0 -0
- /kotonebot/kaa/sprites/{b7ee5425-c4ec-4030-9343-1737628b1936.png → cf8b2ae3-f948-4204-b7da-c0801f1368f4.png} +0 -0
- /kotonebot/kaa/sprites/{929d1dc7-6f9e-444b-9b57-ab8baacfe524.png → db86f5a5-0272-4a74-893e-077acbbecf23.png} +0 -0
- /kotonebot/kaa/sprites/{9cc5a374-ca08-4fa9-a2b7-e1f65871962d.png → dfe926f6-a3b3-48c2-9ebd-757f77d932a6.png} +0 -0
- /kotonebot/kaa/sprites/{63a3a9ca-aff2-428a-8df2-9a0ed4e398c6.png → e2a98bd2-56d1-47e9-806a-a36d06bd3f16.png} +0 -0
- /kotonebot/kaa/sprites/{22394de7-f95b-4001-a961-d854c34f1d8c.png → ecc2500b-4916-4c47-a840-98233d53522b.png} +0 -0
- /kotonebot/kaa/sprites/{70a0da32-7fe7-41a9-9fc1-265764a0b125.png → ed081194-272d-461a-93a1-ec476a896753.png} +0 -0
- /kotonebot/kaa/sprites/{1c0c3381-4d9b-4279-ac89-784b9e9d7e63.png → ef21cbe1-7263-4a68-ad8c-b9aac503978a.png} +0 -0
- /kotonebot/kaa/sprites/{c44a35b8-4254-4f4f-99a8-18a3195ae696.png → f0370809-4383-4039-b8ec-f80a9216a7b3.png} +0 -0
- /kotonebot/kaa/sprites/{39a5eb7d-0ece-4eca-bf0e-4bf2f8faf1e2.png → f47d8096-63bf-42ed-8f4f-5f6f1d8772f4.png} +0 -0
- /kotonebot/kaa/sprites/{14cd7285-f587-49af-9960-802c41050201.png → f60a8a24-b358-4f3a-af2c-4e4a31c5d36e.png} +0 -0
- /kotonebot/kaa/sprites/{b6da32be-5c6d-40a8-b1d0-15e0576c6f71.png → fa1eea22-b329-4c1c-8446-279c542f6da0.png} +0 -0
- /kotonebot/kaa/sprites/{d9b23b65-6780-446b-950c-48ca668f838a.png → fa72809a-d057-40a0-b771-f4d96bc1ced2.png} +0 -0
- /kotonebot/kaa/sprites/{73c270f5-055a-4cc3-9036-c95321faec4a.png → fb870576-1837-4267-bc0f-e0685bf7a136.png} +0 -0
- /kotonebot/kaa/sprites/{d76bed23-33cf-4f86-bb01-add1185098a1.png → fc7b1cdb-d0d0-4470-b5fd-218a8551dc9f.png} +0 -0
- /kotonebot/kaa/sprites/{ef8b7148-cc8f-4a76-a981-68062909e5a9.png → fcbeb870-6853-4e2c-8a6e-54b4787e3a2e.png} +0 -0
- /kotonebot/kaa/sprites/{c0adda90-8b05-4a6b-b091-9d2c9d4b84f8.png → fd354169-e32a-45be-9a1e-da0136b91dc3.png} +0 -0
- {ksaa-2025.8.2.0.dist-info → ksaa-2025.8.23.0.dist-info}/WHEEL +0 -0
- {ksaa-2025.8.2.0.dist-info → ksaa-2025.8.23.0.dist-info}/entry_points.txt +0 -0
- {ksaa-2025.8.2.0.dist-info → ksaa-2025.8.23.0.dist-info}/licenses/LICENSE +0 -0
- {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)
|
kotonebot/kaa/config/__init__.py
CHANGED
|
@@ -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",
|
kotonebot/kaa/config/schema.py
CHANGED
|
@@ -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
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
kotonebot/kaa/resources/game.db
CHANGED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|