ksaa 2025.7.27.1__py3-none-any.whl → 2025.8.17.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 (163) hide show
  1. kotonebot/__init__.py +2 -1
  2. kotonebot/interop/win/shortcut.py +43 -0
  3. kotonebot/kaa/application/adapter/misc_adapter.py +5 -0
  4. kotonebot/kaa/application/core/misc_core.py +33 -0
  5. kotonebot/kaa/errors.py +14 -0
  6. kotonebot/kaa/main/cli.py +2 -1
  7. kotonebot/kaa/main/gr.py +97 -76
  8. kotonebot/kaa/metadata.py +26 -0
  9. kotonebot/kaa/resources/__pycache__/__init__.cpython-310.pyc +0 -0
  10. kotonebot/kaa/resources/game.db +0 -0
  11. kotonebot/kaa/resources/game_ver.txt +0 -0
  12. kotonebot/kaa/resources/idol_cards/i_card-skin-fktn-3-013_0.png +0 -0
  13. kotonebot/kaa/resources/idol_cards/i_card-skin-fktn-3-013_1.png +0 -0
  14. kotonebot/kaa/resources/idol_cards/i_card-skin-hmsz-3-010_0.png +0 -0
  15. kotonebot/kaa/resources/idol_cards/i_card-skin-hmsz-3-010_1.png +0 -0
  16. kotonebot/kaa/resources/idol_cards/i_card-skin-hume-3-012_0.png +0 -0
  17. kotonebot/kaa/resources/idol_cards/i_card-skin-hume-3-012_1.png +0 -0
  18. kotonebot/kaa/resources/idol_cards/i_card-skin-jsna-3-011_0.png +0 -0
  19. kotonebot/kaa/resources/idol_cards/i_card-skin-jsna-3-011_1.png +0 -0
  20. kotonebot/kaa/tasks/R.py +126 -126
  21. kotonebot/kaa/tasks/actions/scenes.py +4 -10
  22. kotonebot/kaa/tasks/daily/capsule_toys.py +3 -4
  23. kotonebot/kaa/tasks/daily/contest.py +3 -7
  24. kotonebot/kaa/tasks/daily/mission_reward.py +13 -10
  25. kotonebot/kaa/tasks/daily/purchase.py +22 -13
  26. kotonebot/kaa/tasks/produce/cards.py +3 -8
  27. kotonebot/kaa/tasks/produce/common.py +3 -9
  28. kotonebot/kaa/tasks/produce/in_purodyuusu.py +93 -81
  29. kotonebot/kaa/tasks/produce/non_lesson_actions.py +35 -27
  30. kotonebot/kaa/tasks/produce/produce.py +18 -18
  31. kotonebot/kaa/tasks/start_game.py +4 -9
  32. {ksaa-2025.7.27.1.dist-info → ksaa-2025.8.17.0.dist-info}/METADATA +1 -1
  33. {ksaa-2025.7.27.1.dist-info → ksaa-2025.8.17.0.dist-info}/RECORD +163 -152
  34. /kotonebot/kaa/sprites/{4ced1b5f-bbd2-4230-8555-233d082f4d05.png → 00a2e0d4-1683-4c36-88df-081673e2fe1a.png} +0 -0
  35. /kotonebot/kaa/sprites/{093c3fb8-036e-4cf4-917b-d70cabebf571.png → 07578d0c-15d4-42a2-9db1-a1c0c11b55c1.png} +0 -0
  36. /kotonebot/kaa/sprites/{9f2a6935-f462-4726-b56e-8cf23aae3982.png → 079cdbed-7171-42e3-8298-9d1e180982ec.png} +0 -0
  37. /kotonebot/kaa/sprites/{31122061-ea7a-419e-8072-8552013a8255.png → 07c5517b-38f7-44e6-8506-84317ba0fb86.png} +0 -0
  38. /kotonebot/kaa/sprites/{ddc8f913-e9ae-46dc-a91a-d3ee79e9f32d.png → 07d78d3e-4e79-459e-9c41-43f4a618f9e9.png} +0 -0
  39. /kotonebot/kaa/sprites/{14283368-d85d-458a-8f2c-b112bd02256e.png → 0899e636-b767-45e6-ab63-258d19d3f806.png} +0 -0
  40. /kotonebot/kaa/sprites/{f23cb531-18b5-4852-bb11-56dc621e56cc.png → 0b27cdd2-490b-4a6a-ae0d-788ac1601dcc.png} +0 -0
  41. /kotonebot/kaa/sprites/{5033ca17-1327-4554-b939-968b8a78f10a.png → 0b947c81-0ab1-40a8-8c26-26258be572c7.png} +0 -0
  42. /kotonebot/kaa/sprites/{a66625f6-f80c-48e4-a344-e48036085e2b.png → 0da004d8-2cc5-43ab-9ac1-94d4f74dd37d.png} +0 -0
  43. /kotonebot/kaa/sprites/{4c444aaf-a2d1-44f1-aacc-b737f262a746.png → 0de1fa4d-3621-4671-9e1f-b8ed1e767adc.png} +0 -0
  44. /kotonebot/kaa/sprites/{f957fbb8-ba30-47c0-97b8-ff531d6e3831.png → 0e998848-beb2-4d31-9019-6afab9e0180e.png} +0 -0
  45. /kotonebot/kaa/sprites/{5f3937f7-a5de-4a11-bcf9-da586596bf47.png → 0ef0615f-f293-4a4e-93ac-985b3a17c8d7.png} +0 -0
  46. /kotonebot/kaa/sprites/{d0881e29-6da6-4823-b65c-eefa9f9f2208.png → 1135ed8d-4e1c-4896-9d6d-5c2ba3d29761.png} +0 -0
  47. /kotonebot/kaa/sprites/{116bf963-ad4a-401a-91f7-e3a56a4848b9.png → 12b811a3-5b37-4510-9ebd-95455644f253.png} +0 -0
  48. /kotonebot/kaa/sprites/{29fc852e-4c61-416d-80ff-f28c5a64abc1.png → 130ee78a-c201-4fa0-bac5-7be0b842312d.png} +0 -0
  49. /kotonebot/kaa/sprites/{ac0b1f47-ce60-479a-9c5d-d8ced42ec0e0.png → 1339693d-6e77-4058-921a-9079c8eb5a9a.png} +0 -0
  50. /kotonebot/kaa/sprites/{acff3d83-f570-4c65-9bb3-db69cd525262.png → 141b5f13-489d-4271-ac49-4d0bd40bf8fc.png} +0 -0
  51. /kotonebot/kaa/sprites/{36e02aa6-f858-4248-b39e-e16686d6baf1.png → 14488bad-1e16-47b8-9870-f2e18c6b87ee.png} +0 -0
  52. /kotonebot/kaa/sprites/{1b2a0de3-34cc-42b2-8af3-bfeb8d0d679c.png → 1466ba09-8e27-49cd-8606-f9feeecc2915.png} +0 -0
  53. /kotonebot/kaa/sprites/{c157661d-de06-4e34-bc3b-7d79c987e26d.png → 15ce2944-3d27-4073-b969-2ec8fc98ceb4.png} +0 -0
  54. /kotonebot/kaa/sprites/{80c6d473-1eb2-4d65-8e8d-8f267ab61cd9.png → 1777dfb5-2793-4037-9da7-f789cf65896e.png} +0 -0
  55. /kotonebot/kaa/sprites/{7e614cff-b492-4c4d-bbfe-0853ff65fcec.png → 1abdc520-6123-40c9-bf50-d84e46f9420c.png} +0 -0
  56. /kotonebot/kaa/sprites/{661d0e8d-379d-401d-9f29-147e70123adf.png → 1ae6b793-d85f-4b06-ba9f-bdb7fbed26fc.png} +0 -0
  57. /kotonebot/kaa/sprites/{7c7cbe5a-37f0-4cf3-8376-4ceeb7a662b0.png → 1d5835f8-593c-4ec4-a360-81fce8d2f959.png} +0 -0
  58. /kotonebot/kaa/sprites/{d6235144-ce78-4884-88b4-d1a12b76155f.png → 1e540586-c381-4aed-b689-e9cd2708ae85.png} +0 -0
  59. /kotonebot/kaa/sprites/{eea2af85-94b2-4c41-8f51-393059dcc43c.png → 1f8cca6a-ae0a-44c9-a267-989ae508320a.png} +0 -0
  60. /kotonebot/kaa/sprites/{ebb662bb-62b4-404c-bb8f-4a7d5feccaa8.png → 214fad37-3e64-4786-8cfa-b48dd49ddbe4.png} +0 -0
  61. /kotonebot/kaa/sprites/{d32f8851-4fd2-4484-8ae8-66a375a43f3d.png → 21f2fdd8-c6fe-44fe-bcc6-efa8bc7f895a.png} +0 -0
  62. /kotonebot/kaa/sprites/{ff361c63-3f3d-48df-a26f-7698bd459219.png → 255b0e7a-c47a-4f70-9c92-5e3fa06d4d4c.png} +0 -0
  63. /kotonebot/kaa/sprites/{3cd5382a-a679-4f06-ab83-6328a943148d.png → 2ac9bca3-aad6-4d19-a4b7-4d7197d95fba.png} +0 -0
  64. /kotonebot/kaa/sprites/{a148b768-8c8d-4fee-b29f-11d73240a3d0.png → 2c43b51a-7ca5-4401-a05f-d3b3de17c2d3.png} +0 -0
  65. /kotonebot/kaa/sprites/{66c7e6df-5c90-4b3a-9b51-78cff1357ed7.png → 2e279b36-1057-453f-9a7e-7ac61ddce6f9.png} +0 -0
  66. /kotonebot/kaa/sprites/{2585cb7b-af94-46ac-a31d-f50bd09f40a6.png → 2e5cfcf0-34fc-4b17-9283-0c269d04ae98.png} +0 -0
  67. /kotonebot/kaa/sprites/{28e5138d-bcd4-40d2-9e2f-0c845004b8ae.png → 32d066ef-5783-4ab4-8a41-5e948169b1d7.png} +0 -0
  68. /kotonebot/kaa/sprites/{1c14e581-b664-488c-9d29-f5228ee6d328.png → 3303b048-552d-4794-aa57-180b43187d5a.png} +0 -0
  69. /kotonebot/kaa/sprites/{566e641a-a364-415c-a17b-2db7862f2714.png → 3336498e-763b-4b43-9939-a271d2deb64f.png} +0 -0
  70. /kotonebot/kaa/sprites/{dd5ffd48-2ab0-4795-8193-8a8310101574.png → 350736d7-0774-4a48-973c-d9373fc68ea3.png} +0 -0
  71. /kotonebot/kaa/sprites/{8938249c-94d3-4f20-8013-85d481a54d87.png → 368d245a-8777-437a-80c4-e6b0504236e6.png} +0 -0
  72. /kotonebot/kaa/sprites/{9b439501-e57d-4912-9f57-67c4534060f7.png → 394c60cc-1caa-4a29-a387-798316d48d4a.png} +0 -0
  73. /kotonebot/kaa/sprites/{3d7d1e3f-29c7-431d-8621-3f31b8880492.png → 3bf9aa00-7c6d-46ec-b487-7f846588acbe.png} +0 -0
  74. /kotonebot/kaa/sprites/{34dcd41c-b800-43b4-b24f-c569bae59db2.png → 4183bf72-4ca7-4480-a6db-c81632b1a62b.png} +0 -0
  75. /kotonebot/kaa/sprites/{7b552e56-0065-45d8-a0dc-bfe3be62b91f.png → 42092d5b-d11d-4651-9cd5-49302f52d50b.png} +0 -0
  76. /kotonebot/kaa/sprites/{96b12d02-c634-4e9c-a465-7ee61d5fc0bd.png → 4365cb24-54a1-4998-8a2e-bed02fc988f5.png} +0 -0
  77. /kotonebot/kaa/sprites/{7e4a2554-c05b-458f-b31f-ac6930e8078e.png → 471d7204-23f3-4d72-a852-77e8b424ddff.png} +0 -0
  78. /kotonebot/kaa/sprites/{6d225f8d-efc0-42a5-93af-7b81e24377c5.png → 48fc4fee-0d6e-4995-8d29-37791d33759e.png} +0 -0
  79. /kotonebot/kaa/sprites/{8cbbfa8e-17aa-42e7-92f7-319a02c8f7fa.png → 49fa1fd6-8115-476d-aa60-2d63613ef931.png} +0 -0
  80. /kotonebot/kaa/sprites/{d94ce829-a7ab-44aa-bc0c-a4801b650088.png → 4c07fc6b-662a-4216-b1e6-6036fa6f717d.png} +0 -0
  81. /kotonebot/kaa/sprites/{ee8a6029-63b3-4c13-bdc5-9bd8546d3316.png → 4c2fe337-73f6-4ed4-84ae-f17bf4787645.png} +0 -0
  82. /kotonebot/kaa/sprites/{3e558d01-1d7d-4ed3-9200-738252539dc1.png → 54a7603e-fd84-4d7f-99ef-f95d3695aa42.png} +0 -0
  83. /kotonebot/kaa/sprites/{5ba7d61f-282d-4ad0-881a-842c26e7f66c.png → 54e4f9a3-3ae6-4bf4-85b1-680889835137.png} +0 -0
  84. /kotonebot/kaa/sprites/{5a0d6f90-3758-4baa-94fc-a4a412284628.png → 550c0ad2-4c38-4c34-8be2-9ea278b3f822.png} +0 -0
  85. /kotonebot/kaa/sprites/{0f986eac-1e3c-48ed-9850-cae529b30503.png → 5b3f7210-d28b-4117-a664-efb790eec911.png} +0 -0
  86. /kotonebot/kaa/sprites/{d77a936b-c0ae-4dbd-8b44-82288a0957d6.png → 6224165f-3fa9-483f-b4fb-73c44e8009e4.png} +0 -0
  87. /kotonebot/kaa/sprites/{ff5a0417-229f-41bd-8121-708b08417114.png → 63b1d3d9-a0d7-413e-8e67-215ee46e5af7.png} +0 -0
  88. /kotonebot/kaa/sprites/{7fcc8f4c-9d06-4747-8c1e-aaba3a61cc0e.png → 64d7e162-a761-458b-a0c6-083658141032.png} +0 -0
  89. /kotonebot/kaa/sprites/{60cfef80-cd08-4205-8088-8d0b22a59b5a.png → 6b33fe3c-28ff-49ad-ba24-7279c8e9ec19.png} +0 -0
  90. /kotonebot/kaa/sprites/{81fec353-ad18-4223-9ea3-8d128a4a3e77.png → 6b4f820d-8b40-4ac1-9322-550860cbda08.png} +0 -0
  91. /kotonebot/kaa/sprites/{2d902d81-5500-4265-9867-c5c4cac573d7.png → 6ede6499-0efe-4ad2-83c7-5fd8a512c52e.png} +0 -0
  92. /kotonebot/kaa/sprites/{47f4b0a5-5792-4e82-b597-d58ea0b1f494.png → 71293cd1-83de-4f15-9608-1d31678e3566.png} +0 -0
  93. /kotonebot/kaa/sprites/{c2e3d6ac-00b6-4d2a-a30b-52a1190f5f05.png → 71ce4a03-5865-47fb-a2a2-d220dbd8ead3.png} +0 -0
  94. /kotonebot/kaa/sprites/{61f56d51-8d30-4aed-857a-8eff6fab27c1.png → 720cfc0e-74a2-4239-bc08-ea9927871cd0.png} +0 -0
  95. /kotonebot/kaa/sprites/{a2d9b907-f68e-47c7-8aa6-31c07c272d94.png → 73eec0a3-e3ba-40c8-b163-321a5b7feb81.png} +0 -0
  96. /kotonebot/kaa/sprites/{3bd19f01-57f8-4f8b-98b7-b5dd0779f77d.png → 74c8b69c-bceb-438f-a4a4-49e3abd7fa46.png} +0 -0
  97. /kotonebot/kaa/sprites/{432df4be-4970-4ac0-8465-a698bce6fe65.png → 757d08d7-c7a1-430a-8938-edd824ed7117.png} +0 -0
  98. /kotonebot/kaa/sprites/{aab26578-b548-41e5-8996-40ef821ca041.png → 7e00779b-de42-4406-88f9-07d93e47f104.png} +0 -0
  99. /kotonebot/kaa/sprites/{7dcc9134-9e5f-433b-ae5c-7530484f3f5f.png → 82eab6fc-1968-42a4-bb43-d9cee984b33d.png} +0 -0
  100. /kotonebot/kaa/sprites/{bd04472b-eeeb-4ad7-b385-8347b7053887.png → 850d5405-2103-4a2f-9e00-d5c5f43ce9a7.png} +0 -0
  101. /kotonebot/kaa/sprites/{4de619fd-ed06-4210-b1f0-11556deb4dd9.png → 864b57b0-c2f9-49eb-864c-314f72c0f56c.png} +0 -0
  102. /kotonebot/kaa/sprites/{252f1cd3-8e09-4b34-b5ba-47b1137a19c1.png → 88476c65-0056-4ae4-9c9e-3ff1bae964e8.png} +0 -0
  103. /kotonebot/kaa/sprites/{adc38fcc-84d2-4f7c-846d-4fe96dd5d08a.png → 896ed7b5-72c8-4c1d-90ff-eb7f12876f9c.png} +0 -0
  104. /kotonebot/kaa/sprites/{7dfdefa7-d95f-4348-9e0b-640ed17e138f.png → 8e021860-0c8f-4da5-84f8-1ed65ad6f720.png} +0 -0
  105. /kotonebot/kaa/sprites/{b5a58c56-3f09-47e5-ab61-57bab752e735.png → 8e90dc5b-d79a-4133-b722-edbb14f5f0db.png} +0 -0
  106. /kotonebot/kaa/sprites/{dc64e856-2f31-48b1-b17d-32b499f819ce.png → 917be8d3-602c-495c-b2ed-41b1c84e7398.png} +0 -0
  107. /kotonebot/kaa/sprites/{f7a4208f-0373-4f26-907f-84c3f2b810fc.png → 918db28b-0d43-4056-a506-3279f2b724c8.png} +0 -0
  108. /kotonebot/kaa/sprites/{3ace2c73-cf00-4706-9aac-1a0229b1b3f5.png → 93f74a70-acd1-4453-8254-07a797839b5f.png} +0 -0
  109. /kotonebot/kaa/sprites/{464c3d3a-c772-4f85-94d5-970f46c8d213.png → 99967c02-b5cf-43ba-9ca6-23e2781b25d9.png} +0 -0
  110. /kotonebot/kaa/sprites/{04c9d1c8-09b9-402d-b688-796253fdaf0c.png → 9aee770e-1746-4076-b3c4-5da218321614.png} +0 -0
  111. /kotonebot/kaa/sprites/{6468ab50-2d25-4b18-b555-2a56397968b0.png → 9bc1e849-e69d-4849-a849-45ea81829567.png} +0 -0
  112. /kotonebot/kaa/sprites/{e62afa2c-1c5b-426e-8ff1-ea51f75d0f20.png → 9dfde42d-fd40-435b-8a41-50be0fb8781e.png} +0 -0
  113. /kotonebot/kaa/sprites/{1d457687-ff10-41b0-95e1-6c1b3868b2a0.png → 9ec515d0-c177-43fa-bbf3-ea2a57080969.png} +0 -0
  114. /kotonebot/kaa/sprites/{e7a0ea00-2a72-4d74-8664-53726e3e1078.png → a0fc1501-162d-49c6-824c-03e028d8fed7.png} +0 -0
  115. /kotonebot/kaa/sprites/{b92c4308-3778-47aa-8a0b-222d32721beb.png → a2e9d3a5-6f6f-4530-8a35-a09edfd35b8e.png} +0 -0
  116. /kotonebot/kaa/sprites/{c8f444cc-e809-44c2-86a3-3cbb5bcd0356.png → a5e11b99-d89e-47a2-ae67-4e0a04bfc022.png} +0 -0
  117. /kotonebot/kaa/sprites/{7a8c4af3-2ac1-4295-b844-350ad00f2c50.png → a6a23fad-cc30-43cd-b869-d2fad70d32ab.png} +0 -0
  118. /kotonebot/kaa/sprites/{d5a9d7f7-a065-4ff3-ae4c-b027f348ef54.png → a7cc8346-8b35-4f6a-acef-8cd4d29b5591.png} +0 -0
  119. /kotonebot/kaa/sprites/{2c2ff5ed-3b1a-4dcc-89a9-9457908cb184.png → a7f49544-2aaf-4f5c-a217-7203bfa87758.png} +0 -0
  120. /kotonebot/kaa/sprites/{52ae79ea-f4a4-4c19-9fe8-327f285ace1e.png → a885914f-a305-4af3-b2a5-991fdf0101f6.png} +0 -0
  121. /kotonebot/kaa/sprites/{8ed3eab8-779b-4b66-bc24-06b0b1dfac18.png → a914c9d7-3a19-4d9c-940e-579bf3f7fa79.png} +0 -0
  122. /kotonebot/kaa/sprites/{ad9cc197-c83d-4d39-b187-7105cde60ef5.png → a9e30963-0772-401a-85f8-33369ca22267.png} +0 -0
  123. /kotonebot/kaa/sprites/{a6bd2250-81b5-4f54-b6d9-bf9a5a4876d1.png → aa55089d-7b80-4763-a226-cde10e56f8a5.png} +0 -0
  124. /kotonebot/kaa/sprites/{88e4e3c6-3f6b-4192-83c7-4b20a51ad53a.png → aed0fd9a-0e59-4ead-b6a2-497b94f0eb16.png} +0 -0
  125. /kotonebot/kaa/sprites/{c84eada8-ff68-4d73-802b-6de88e73ec6d.png → af5714a6-e4a0-47ef-9151-2a8c9614e931.png} +0 -0
  126. /kotonebot/kaa/sprites/{a1791427-52af-4d1e-8e95-e0533cb66d3c.png → b176f60c-94ba-46e3-b562-7fc86b25c17f.png} +0 -0
  127. /kotonebot/kaa/sprites/{e25468f5-929a-4a49-a2e0-4527075353b5.png → b22260e3-22c6-4c80-b986-f4fd8db22ddc.png} +0 -0
  128. /kotonebot/kaa/sprites/{03821ecf-fdd2-4e89-8249-fc7288ac79be.png → b3debf96-a90b-4de7-b19e-83c2d82075ee.png} +0 -0
  129. /kotonebot/kaa/sprites/{a7e31af5-a896-47bb-af4b-e71936ac6334.png → b3e5704b-63c9-4226-9e49-69c680627b61.png} +0 -0
  130. /kotonebot/kaa/sprites/{f93c7a24-157d-43ef-adcc-3873d313c6d7.png → b66ed448-356e-44f9-ad45-40473d47ee24.png} +0 -0
  131. /kotonebot/kaa/sprites/{f08044bf-8a33-4d6b-8791-94470678efa6.png → b7283194-0e6d-4ac1-84e0-c2062af8eba8.png} +0 -0
  132. /kotonebot/kaa/sprites/{bba3cd68-3023-4a7b-9fe9-36ec7adbfc89.png → bd5190da-d3ed-462e-a573-b8f015cdef97.png} +0 -0
  133. /kotonebot/kaa/sprites/{eb67d908-13f8-4cef-9a86-9770e342ab77.png → be0bca2e-dfd5-48b6-a2ac-e2699991d37b.png} +0 -0
  134. /kotonebot/kaa/sprites/{2a539cb4-827f-449b-9780-14a94678948b.png → be2d7e60-56d2-4891-aae9-b5d2a65a8d03.png} +0 -0
  135. /kotonebot/kaa/sprites/{6a033af8-222c-459a-9ab9-a9a69b27822d.png → c654428b-4f16-4257-800f-da627ddb7595.png} +0 -0
  136. /kotonebot/kaa/sprites/{749bd918-8dfb-4393-bf91-b39e285f1d75.png → ca850faa-154e-4170-9446-91dd325e14af.png} +0 -0
  137. /kotonebot/kaa/sprites/{f03739ee-31e1-40ca-9aaf-6c0447d426a4.png → cce54a7c-bdd5-4063-8a40-e01709e69893.png} +0 -0
  138. /kotonebot/kaa/sprites/{05903cc9-9f7a-43ac-88e4-988a68311e05.png → cd5ba3a7-96aa-4efc-97fc-b72f72d084d2.png} +0 -0
  139. /kotonebot/kaa/sprites/{a3d5b052-526f-45ef-a2ed-5bba8ca9e4b1.png → d3c31276-8395-4aa3-ae1a-4c50a24e8574.png} +0 -0
  140. /kotonebot/kaa/sprites/{d0ad5222-0ee0-412e-819f-3217f9fd854b.png → d40a6e09-4740-41a8-af0f-9da09de38bf1.png} +0 -0
  141. /kotonebot/kaa/sprites/{360bcb7f-c710-49d5-9942-2812ed03a447.png → d559328f-9b26-4ea1-8f96-f432abf0214d.png} +0 -0
  142. /kotonebot/kaa/sprites/{f88f9f3b-e0e7-498c-ad1c-e92a719164f3.png → d597a32e-5ccb-4550-ab18-1905123c22d4.png} +0 -0
  143. /kotonebot/kaa/sprites/{efb31647-3760-4b76-8b5d-ec4b5fb7a975.png → d5a25a5f-8bd0-4f09-aec7-fda24eaf795e.png} +0 -0
  144. /kotonebot/kaa/sprites/{c370b930-9750-4782-9564-5ce4cd609bdd.png → d9432d63-1aef-43a7-8642-d10f3c15b092.png} +0 -0
  145. /kotonebot/kaa/sprites/{31745cd7-226e-4e11-b96d-2e202a7097e7.png → da351a32-c51f-4746-8f89-778343772d08.png} +0 -0
  146. /kotonebot/kaa/sprites/{eec4d7d6-3084-4bab-99c1-10e3a9459393.png → da7ef120-103c-4d5f-b95c-2bcd29757d3c.png} +0 -0
  147. /kotonebot/kaa/sprites/{e54b7482-a348-4252-a373-2ee69b3805b5.png → e4c40e7a-f67c-45d6-9775-8389bcff0b67.png} +0 -0
  148. /kotonebot/kaa/sprites/{75cad2af-b8c5-4f5f-8398-acd90eb4348e.png → e850b360-da95-4498-ab3e-177e0d57e189.png} +0 -0
  149. /kotonebot/kaa/sprites/{6597b7fd-3c5b-442f-a327-d18b555de544.png → e8935f50-3109-4d98-9783-86738763a431.png} +0 -0
  150. /kotonebot/kaa/sprites/{e049018e-9d2b-4537-add1-e902cf8ac69a.png → ed2f8cd2-be82-4d48-acd0-c48cf8bdd800.png} +0 -0
  151. /kotonebot/kaa/sprites/{39882ba6-c9d9-4742-b92d-206781c5f60e.png → ed56bfc1-d3c5-4bc3-a910-f861cfb2f379.png} +0 -0
  152. /kotonebot/kaa/sprites/{9a0c8f11-33f0-4c53-a911-556f3481d952.png → ed822aca-dde6-4235-8776-0c47884c4a9a.png} +0 -0
  153. /kotonebot/kaa/sprites/{3ea31c2c-1421-421c-a7fa-7994c06e4bca.png → ef46ae80-8c34-4948-9076-b0536805e7dc.png} +0 -0
  154. /kotonebot/kaa/sprites/{967b207a-79bb-479a-b50e-b2a04cf7ed54.png → f11ca963-fc05-4486-acf7-aa8f7415e6b5.png} +0 -0
  155. /kotonebot/kaa/sprites/{fbbf4921-ece5-4dc0-875d-8f7182596d4f.png → f404eabd-6b87-48a4-8ad7-1e7d521daa94.png} +0 -0
  156. /kotonebot/kaa/sprites/{1f5f5454-eb1c-45c3-8467-80c224d528e6.png → f61e28cd-9eaa-4d3c-b25d-8bfdaecb1255.png} +0 -0
  157. /kotonebot/kaa/sprites/{15ee94ce-1930-4eff-9ce2-0ebe947aaa05.png → f9bba6f1-6237-43bf-85b1-f6250a64a5d6.png} +0 -0
  158. /kotonebot/kaa/sprites/{76acc2b6-6649-4b1a-bd52-18ab9a2341d0.png → fb2694c2-8f0e-4ec3-9d76-087f085f2e55.png} +0 -0
  159. /kotonebot/kaa/sprites/{6c151fbe-7cf9-4629-b47a-da7be835bb4b.png → fbe45406-81bd-4298-ab4f-ed7346c25eb8.png} +0 -0
  160. {ksaa-2025.7.27.1.dist-info → ksaa-2025.8.17.0.dist-info}/WHEEL +0 -0
  161. {ksaa-2025.7.27.1.dist-info → ksaa-2025.8.17.0.dist-info}/entry_points.txt +0 -0
  162. {ksaa-2025.7.27.1.dist-info → ksaa-2025.8.17.0.dist-info}/licenses/LICENSE +0 -0
  163. {ksaa-2025.7.27.1.dist-info → ksaa-2025.8.17.0.dist-info}/top_level.txt +0 -0
kotonebot/__init__.py CHANGED
@@ -36,4 +36,5 @@ from .backend.ocr import (
36
36
  equals,
37
37
  )
38
38
  from .backend.bot import KotoneBot
39
- from .ui import user
39
+ from .backend.loop import Loop
40
+ from .ui import user
@@ -0,0 +1,43 @@
1
+ import os
2
+ import typing
3
+
4
+ import pythoncom
5
+ from win32comext.shell import shell, shellcon
6
+
7
+ def create_shortcut(target_file: str, target_args: str, link_file: str | None, *,
8
+ link_name: str | None = None,
9
+ icon_path: str, description: str = ""):
10
+ """
11
+ Creates a shortcut.
12
+
13
+ :param target_file: The path to the target file.
14
+ :param target_args: The arguments for the target file.
15
+ :param link_file: The path to the shortcut file. If None, creates on the desktop.
16
+ :param link_name: The name of the shortcut file. If None, it is derived from the target file name.
17
+ Only used when link_file is None.
18
+ :param icon_path: The path to the icon file.
19
+ :param description: The description of the shortcut.
20
+ """
21
+ pythoncom.CoInitialize()
22
+ if link_file is None:
23
+ desktop_path = shell.SHGetFolderPath(0, shellcon.CSIDL_DESKTOP, 0, 0)
24
+ if link_name is None:
25
+ link_name = os.path.splitext(os.path.basename(target_file))[0]
26
+ link_file = os.path.join(desktop_path, f"{link_name}.lnk")
27
+
28
+ shortcut = pythoncom.CoCreateInstance(
29
+ shell.CLSID_ShellLink,
30
+ None,
31
+ pythoncom.CLSCTX_INPROC_SERVER,
32
+ shell.IID_IShellLink
33
+ )
34
+ # TODO: 下面这些方法都没有 typing,会报错,需要一种方法加入 typing
35
+ shortcut.SetPath(target_file) # type: ignore
36
+ shortcut.SetArguments(target_args) # type: ignore
37
+ shortcut.SetDescription(description) # type: ignore
38
+ shortcut.SetIconLocation(icon_path, 0) # type: ignore
39
+
40
+ persist_file = shortcut.QueryInterface(pythoncom.IID_IPersistFile)
41
+ persist_file.Save(link_file, 0) # type: ignore
42
+ pythoncom.CoUninitialize()
43
+
@@ -0,0 +1,5 @@
1
+ from ..core import misc_core
2
+
3
+
4
+ def create_desktop_shortcut(start_immediately: bool):
5
+ misc_core.create_desktop_shortcut(start_immediately)
@@ -0,0 +1,33 @@
1
+ import os
2
+ import sys
3
+
4
+ from kotonebot.interop.win.shortcut import create_shortcut
5
+ from kotonebot.kaa.errors import LauncherNotFoundError
6
+
7
+
8
+ def create_desktop_shortcut(start_immediately: bool):
9
+ exe_path = os.path.abspath('./kaa.exe')
10
+ if not os.path.exists(exe_path):
11
+ raise LauncherNotFoundError()
12
+
13
+ icon_paths = ['./kaa.exe', './kaa.ico']
14
+ icon_path = next((os.path.abspath(p) for p in icon_paths if os.path.exists(p)), '')
15
+
16
+ if start_immediately:
17
+ create_shortcut(
18
+ target_file=exe_path,
19
+ target_args='--start-immidiately',
20
+ link_file=None, # Creates on desktop
21
+ link_name='琴音小助手(快捷启动)',
22
+ icon_path=icon_path,
23
+ description='启动琴音小助手并立即运行任务'
24
+ )
25
+ else:
26
+ create_shortcut(
27
+ target_file=exe_path,
28
+ target_args='',
29
+ link_file=None, # Creates on desktop
30
+ link_name='琴音小助手',
31
+ icon_path=icon_path,
32
+ description='启动琴音小助手'
33
+ )
kotonebot/kaa/errors.py CHANGED
@@ -7,11 +7,18 @@ class KaaError(Exception):
7
7
 
8
8
  class KaaUserFriendlyError(UserFriendlyError, KaaError):
9
9
  def __init__(self, message: str, help_link: str):
10
+ self.message = message
11
+ """用户友好的错误信息"""
12
+ self.help_link = help_link
13
+ """此错误的帮助链接"""
10
14
  super().__init__(message, [
11
15
  (0, '打开帮助', lambda: os.startfile(help_link)),
12
16
  (1, '知道了', lambda: None)
13
17
  ])
14
18
 
19
+ def __str__(self):
20
+ return f'【发生错误】{self.message}。访问 {self.help_link} 以获取更多帮助。'
21
+
15
22
  class ProduceSolutionNotFoundError(KaaUserFriendlyError):
16
23
  def __init__(self, solution_id: str):
17
24
  self.solution_id = solution_id
@@ -36,3 +43,10 @@ class IdolCardNotFoundError(KaaUserFriendlyError):
36
43
  f'未找到 ID 为「{skin_id}」的偶像卡。请检查游戏内偶像皮肤与培育方案中偶像皮肤是否一致。',
37
44
  'https://kdocs.cn/l/cetCY8mGKHLj?linkname=cySASqoPGj'
38
45
  )
46
+
47
+ class LauncherNotFoundError(KaaUserFriendlyError):
48
+ def __init__(self):
49
+ super().__init__(
50
+ '未找到启动器「kaa.exe」,请确认是否正确放置在根目录。',
51
+ 'https://kdocs.cn/l/cetCY8mGKHLj?linkname=jpzb09rLTS'
52
+ )
kotonebot/kaa/main/cli.py CHANGED
@@ -21,6 +21,7 @@ psr.add_argument('-lp', '--log-path', default=None, help='Path to the log file.
21
21
  psr.add_argument('-ll', '--log-level', default='DEBUG', help='Log level. Default: DEBUG')
22
22
  psr.add_argument('--kill-dmm', action='store_true', default=False, help='Kill DMM Game Player when tasks are completed. Overrides config().end_game.kill_dmm')
23
23
  psr.add_argument('--kill-game', action='store_true', default=False, help='Kill gakumasu.exe when tasks are completed. Overrides config().end_game.kill_game')
24
+ psr.add_argument('--start-immidiately', action='store_true', default=False, help='Start tasks immediately after launching the UI. Only available when no subcommand is specified.')
24
25
 
25
26
  # 子命令
26
27
  subparsers = psr.add_subparsers(dest='subcommands', title='Subcommands')
@@ -119,7 +120,7 @@ def main():
119
120
  kaa().set_log_level(logging.DEBUG)
120
121
  kaa().add_file_logger(log_filename)
121
122
  from .gr import main as gr_main
122
- gr_main(kaa())
123
+ gr_main(kaa(), psr.parse_args().start_immidiately)
123
124
 
124
125
  if __name__ == '__main__':
125
126
  main()
kotonebot/kaa/main/gr.py CHANGED
@@ -30,6 +30,7 @@ from kotonebot.kaa.config import (
30
30
  RecommendCardDetectionMode, TraceConfig, StartGameConfig, EndGameConfig, UpgradeSupportCardConfig, MiscConfig,
31
31
  )
32
32
  from kotonebot.kaa.config.produce import ProduceSolution, ProduceSolutionManager, ProduceData
33
+ from kotonebot.kaa.application.adapter.misc_adapter import create_desktop_shortcut
33
34
 
34
35
  logger = logging.getLogger(__name__)
35
36
  GradioInput = gr.Textbox | gr.Number | gr.Checkbox | gr.Dropdown | gr.Radio | gr.Slider | gr.Tabs | gr.Tab
@@ -870,75 +871,102 @@ class KotoneBotUI:
870
871
 
871
872
  def _create_emulator_settings(self) -> ConfigBuilderReturnValue:
872
873
  gr.Markdown("### 模拟器设置")
873
- has_mumu12 = Mumu12Host.installed()
874
- has_leidian = LeidianHost.installed()
875
874
  current_tab = 0
876
875
 
877
876
  def _update_emulator_tab_options(impl_value: str, selected_index: int):
878
877
  nonlocal current_tab
879
878
  current_tab = selected_index
880
-
881
- # if selected_index == 3: # DMM
882
- # choices = ['windows', 'remote_windows']
883
- # else: # Mumu, Leidian, Custom
884
- # choices = ['adb', 'adb_raw', 'uiautomator2']
885
- # else:
886
- # raise ValueError(f'Unsupported backend type: {type_in_config}')
887
879
  choices = ['adb', 'adb_raw', 'uiautomator2', 'windows', 'remote_windows', 'nemu_ipc']
888
880
  if impl_value not in choices:
889
881
  new_value = choices[0]
890
882
  else:
891
883
  new_value = impl_value
892
-
893
- return gr.Dropdown(choices=choices, value=new_value)
884
+ return new_value
894
885
 
895
886
  with gr.Tabs(selected=self.current_config.backend.type):
896
- with gr.Tab("MuMu 12", interactive=has_mumu12, id="mumu12") as tab_mumu12:
887
+ with gr.Tab("MuMu 12", id="mumu12") as tab_mumu12:
897
888
  gr.Markdown("已选中 MuMu 12 模拟器")
898
- if has_mumu12:
889
+ mumu_refresh_message = gr.Markdown("<div style='color: red;'>点击下方「刷新」按钮载入信息</div>", visible=True)
890
+ mumu_instance = gr.Dropdown(
891
+ label="选择多开实例",
892
+ choices=[],
893
+ interactive=True
894
+ )
895
+ mumu_refresh_btn = gr.Button("刷新")
896
+
897
+ def refresh_mumu_instances():
899
898
  try:
900
899
  instances = Mumu12Host.list()
901
900
  is_mumu12 = self.current_config.backend.type == 'mumu12'
902
- mumu_instance = gr.Dropdown(
903
- label="选择多开实例",
904
- value=self.current_config.backend.instance_id if is_mumu12 else None,
905
- choices=[(i.name, i.id) for i in instances],
906
- interactive=True
907
- )
908
- mumu_background_mode = gr.Checkbox(
909
- label="MuMu12 模拟器后台保活模式",
910
- value=self.current_config.backend.mumu_background_mode,
911
- info=BackendConfig.model_fields['mumu_background_mode'].description,
912
- interactive=True
913
- )
914
- except: # noqa: E722
901
+ current_id = self.current_config.backend.instance_id if is_mumu12 else None
902
+ choices = [(i.name, i.id) for i in instances]
903
+ return gr.Dropdown(choices=choices, value=current_id, interactive=True), gr.Markdown(visible=False)
904
+ except Exception as e:
915
905
  logger.exception('Failed to list installed MuMu12')
916
- gr.Markdown('获取 MuMu12 模拟器列表失败,请升级模拟器到最新版本。若问题依旧,前往 QQ 群、QQ 频道或 Github 反馈 bug。')
917
- mumu_instance = gr.Dropdown(visible=False)
918
- mumu_background_mode = gr.Checkbox(visible=False)
919
- else:
920
- # 为了让 return 收集组件时不报错
921
- mumu_instance = gr.Dropdown(visible=False)
922
- mumu_background_mode = gr.Checkbox(visible=False)
906
+ gr.Error("获取 MuMu12 模拟器列表失败,请升级模拟器到最新版本。若问题依旧,前往 QQ 群、QQ 频道或 Github 反馈 bug。")
907
+ return gr.Dropdown(choices=[], interactive=True), gr.Markdown(visible=True)
908
+
909
+ mumu_refresh_btn.click(
910
+ fn=refresh_mumu_instances,
911
+ outputs=[mumu_instance, mumu_refresh_message]
912
+ )
913
+
914
+ # 如果当前是 MuMu 模拟器且有配置的 instance_id,立即加载实例列表
915
+ if self.current_config.backend.type == 'mumu12' and self.current_config.backend.instance_id:
916
+ try:
917
+ instances = Mumu12Host.list()
918
+ choices = [(i.name, i.id) for i in instances]
919
+ mumu_instance.choices = choices
920
+ mumu_instance.value = self.current_config.backend.instance_id
921
+ mumu_refresh_message.visible = False
922
+ except Exception as e:
923
+ logger.exception('Failed to auto-load MuMu12 instances')
923
924
 
924
- with gr.Tab("雷电", interactive=has_leidian, id="leidian") as tab_leidian:
925
+ mumu_background_mode = gr.Checkbox(
926
+ label="MuMu12 模拟器后台保活模式",
927
+ value=self.current_config.backend.mumu_background_mode,
928
+ info=BackendConfig.model_fields['mumu_background_mode'].description,
929
+ interactive=True
930
+ )
931
+
932
+ with gr.Tab("雷电", id="leidian") as tab_leidian:
925
933
  gr.Markdown("已选中雷电模拟器")
926
- if has_leidian:
934
+ leidian_refresh_message = gr.Markdown("<div style='color: red;'>点击下方「刷新」按钮载入信息</div>", visible=True)
935
+ leidian_instance = gr.Dropdown(
936
+ label="选择多开实例",
937
+ choices=[],
938
+ interactive=True
939
+ )
940
+ leidian_refresh_btn = gr.Button("刷新")
941
+
942
+ def refresh_leidian_instances():
927
943
  try:
928
944
  instances = LeidianHost.list()
929
945
  is_leidian = self.current_config.backend.type == 'leidian'
930
- leidian_instance = gr.Dropdown(
931
- label="选择多开实例",
932
- value=self.current_config.backend.instance_id if is_leidian else None,
933
- choices=[(i.name, i.id) for i in instances],
934
- interactive=True
935
- )
936
- except: # noqa: E722
946
+ current_id = self.current_config.backend.instance_id if is_leidian else None
947
+ choices = [(i.name, i.id) for i in instances]
948
+ return gr.Dropdown(choices=choices, value=current_id, interactive=True), gr.Markdown(visible=False)
949
+ except Exception as e:
937
950
  logger.exception('Failed to list installed Leidian')
938
- gr.Markdown('获取雷电模拟器列表失败,请前往 QQ 群、QQ 频道或 Github 反馈 bug。')
939
- leidian_instance = gr.Dropdown(visible=False)
940
- else:
941
- leidian_instance = gr.Dropdown(visible=False)
951
+ gr.Error("获取雷电模拟器列表失败,请前往 QQ 群、QQ 频道或 Github 反馈 bug。")
952
+ return gr.Dropdown(choices=[], interactive=True), gr.Markdown(visible=True)
953
+
954
+ leidian_refresh_btn.click(
955
+ fn=refresh_leidian_instances,
956
+ outputs=[leidian_instance, leidian_refresh_message]
957
+ )
958
+
959
+ # 如果当前是雷电模拟器且有配置的 instance_id,立即加载实例列表
960
+ if self.current_config.backend.type == 'leidian' and self.current_config.backend.instance_id:
961
+ try:
962
+ instances = LeidianHost.list()
963
+ choices = [(i.name, i.id) for i in instances]
964
+ leidian_instance.choices = choices
965
+ leidian_instance.value = self.current_config.backend.instance_id
966
+ leidian_refresh_message.visible = False
967
+ except Exception as e:
968
+ logger.exception('Failed to auto-load Leidian instances')
969
+ # 保持显示刷新提示
942
970
 
943
971
  with gr.Tab("自定义", id="custom") as tab_custom:
944
972
  gr.Markdown("已选中自定义模拟器")
@@ -991,13 +1019,6 @@ class KotoneBotUI:
991
1019
  with gr.Tab("DMM", id="dmm") as tab_dmm:
992
1020
  gr.Markdown("已选中 DMM")
993
1021
 
994
- # type_in_config = self.current_config.backend.type
995
- # if type_in_config in ['dmm']:
996
- # choices = ['windows', 'remote_windows']
997
- # elif type_in_config in ['mumu12', 'leidian', 'custom']:
998
- # choices = ['adb', 'adb_raw', 'uiautomator2']
999
- # else:
1000
- # raise ValueError(f'Unsupported backend type: {type_in_config}')
1001
1022
  choices = ['adb', 'adb_raw', 'uiautomator2', 'windows', 'remote_windows', 'nemu_ipc']
1002
1023
  screenshot_impl = gr.Dropdown(
1003
1024
  choices=choices,
@@ -1384,12 +1405,6 @@ class KotoneBotUI:
1384
1405
  info="进行一次 REGULAR 培育需要 ~30min,进行一次 PRO 培育需要 ~1h(具体视设备性能而定)。",
1385
1406
  visible=False
1386
1407
  )
1387
- produce_count = gr.Number(
1388
- minimum=1,
1389
- label="培育次数",
1390
- info="培育的次数。",
1391
- visible=False
1392
- )
1393
1408
 
1394
1409
  # 添加偶像选择
1395
1410
  idol_choices = []
@@ -1505,13 +1520,6 @@ class KotoneBotUI:
1505
1520
  label="培育模式",
1506
1521
  info="进行一次 REGULAR 培育需要 ~30min,进行一次 PRO 培育需要 ~1h(具体视设备性能而定)。"
1507
1522
  )
1508
- produce_count = gr.Number(
1509
- minimum=1,
1510
- value=self.current_config.options.produce.produce_count,
1511
- label="培育次数",
1512
- interactive=True,
1513
- info="培育的次数。"
1514
- )
1515
1523
 
1516
1524
  # 添加偶像选择
1517
1525
  idol_choices = []
@@ -1642,7 +1650,6 @@ class KotoneBotUI:
1642
1650
  gr.Textbox(value="", visible=False), # solution_name
1643
1651
  gr.Textbox(value="", visible=False), # solution_description
1644
1652
  gr.Dropdown(visible=False), # produce_mode
1645
- gr.Number(visible=False), # produce_count
1646
1653
  gr.Dropdown(visible=False), # produce_idols
1647
1654
  gr.Markdown(visible=False), # kotone_warning
1648
1655
  gr.Checkbox(visible=False), # auto_set_memory
@@ -1672,7 +1679,6 @@ class KotoneBotUI:
1672
1679
  gr.Textbox(value=solution.name, visible=True),
1673
1680
  gr.Textbox(value=solution.description or "", visible=True),
1674
1681
  gr.Dropdown(value=solution.data.mode, visible=True),
1675
- gr.Number(value=self.current_config.options.produce.produce_count, visible=True),
1676
1682
  gr.Dropdown(value=solution.data.idol, visible=True),
1677
1683
  gr.Markdown(visible=has_kotone and not is_strict_mode),
1678
1684
  gr.Checkbox(value=solution.data.auto_set_memory, visible=True),
@@ -1768,7 +1774,7 @@ class KotoneBotUI:
1768
1774
  else:
1769
1775
  return gr.Dropdown()
1770
1776
 
1771
- def on_save_solution(solution_id, name, description, mode, count, idols, auto_memory, memory_sets,
1777
+ def on_save_solution(solution_id, name, description, mode, idols, auto_memory, memory_sets,
1772
1778
  auto_support, support_card_sets, pt_boost, note_boost, follow_producer, study_lesson, prefer_ap,
1773
1779
  actions, detection_mode, ap_drink, skip_commu_val):
1774
1780
  """保存培育方案"""
@@ -1810,9 +1816,6 @@ class KotoneBotUI:
1810
1816
  # 保存方案
1811
1817
  solution_manager.save(solution_id, solution)
1812
1818
 
1813
- # 同时更新配置中的 produce_count
1814
- self.current_config.options.produce.produce_count = int(count)
1815
-
1816
1819
  # 重新列出所有方案(确保没有重复项)
1817
1820
  solutions = solution_manager.list()
1818
1821
  solution_choices = [(f"{sol.name} - {sol.description or '无描述'}", sol.id) for sol in solutions]
@@ -1863,7 +1866,7 @@ class KotoneBotUI:
1863
1866
  inputs=[solution_dropdown],
1864
1867
  outputs=[
1865
1868
  solution_name, solution_description,
1866
- produce_mode, produce_count, produce_idols, kotone_warning,
1869
+ produce_mode, produce_idols, kotone_warning,
1867
1870
  auto_set_memory, memory_sets_group, memory_sets,
1868
1871
  auto_set_support, support_card_sets_group, support_card_sets,
1869
1872
  use_pt_boost, use_note_boost, follow_producer,
@@ -1899,7 +1902,7 @@ class KotoneBotUI:
1899
1902
  fn=on_save_solution,
1900
1903
  inputs=[
1901
1904
  solution_dropdown, solution_name, solution_description,
1902
- produce_mode, produce_count, produce_idols,
1905
+ produce_mode, produce_idols,
1903
1906
  auto_set_memory, memory_sets, auto_set_support, support_card_sets,
1904
1907
  use_pt_boost, use_note_boost, follow_producer,
1905
1908
  self_study_lesson, prefer_lesson_ap, actions_order,
@@ -2224,6 +2227,15 @@ class KotoneBotUI:
2224
2227
  info=MiscConfig.model_fields['expose_to_lan'].description,
2225
2228
  interactive=True
2226
2229
  )
2230
+ with gr.Row():
2231
+ gr.Button("创建桌面快捷方式").click(
2232
+ fn=self._create_shortcut_button_click(False),
2233
+ outputs=[]
2234
+ )
2235
+ gr.Button("创建一键启动快捷方式").click(
2236
+ fn=self._create_shortcut_button_click(True),
2237
+ outputs=[]
2238
+ )
2227
2239
 
2228
2240
  def set_config(config: BaseConfig, data: dict[ConfigKey, Any]) -> None:
2229
2241
  config.misc.check_update = data['check_update']
@@ -2236,6 +2248,12 @@ class KotoneBotUI:
2236
2248
  'expose_to_lan': expose_to_lan
2237
2249
  }
2238
2250
 
2251
+ def _create_shortcut_button_click(self, start_immediately: bool) -> Callable[[], None]:
2252
+ def _inner():
2253
+ create_desktop_shortcut(start_immediately)
2254
+ gr.Success("快捷方式创建成功")
2255
+ return _inner
2256
+
2239
2257
  def _create_debug_settings(self) -> ConfigBuilderReturnValue:
2240
2258
  """调试设置:仅在调试时使用"""
2241
2259
  with gr.Column():
@@ -2269,7 +2287,7 @@ class KotoneBotUI:
2269
2287
 
2270
2288
  def _create_settings_tab(self) -> None:
2271
2289
  with gr.Tab("设置"):
2272
- gr.Markdown("## 设置")
2290
+ gr.Markdown("## 设置 <span style='color: red; font-size: 0.8rem; font-weight: normal;'>设置修改后需要保存(网页底部)才会生效!</span>")
2273
2291
 
2274
2292
  # 模拟器设置
2275
2293
  emulator_settings = self._create_emulator_settings()
@@ -2661,11 +2679,14 @@ class KotoneBotUI:
2661
2679
 
2662
2680
  return app
2663
2681
 
2664
- def main(kaa: Kaa | None = None) -> None:
2682
+ def main(kaa: Kaa | None = None, start_immidiately: bool = False) -> None:
2665
2683
  kaa = kaa or Kaa('./config.json')
2666
2684
  ui = KotoneBotUI(kaa)
2667
2685
  app = ui.create_ui()
2668
2686
 
2687
+ if start_immidiately:
2688
+ ui.start_run()
2689
+
2669
2690
  server_name = "0.0.0.0" if ui.current_config.options.misc.expose_to_lan else "127.0.0.1"
2670
2691
  app.launch(inbrowser=True, show_error=True, server_name=server_name)
2671
2692
 
kotonebot/kaa/metadata.py CHANGED
@@ -1,6 +1,32 @@
1
1
  WHATS_NEW = """
2
2
  # 更新日志
3
3
  ## kaa
4
+ ### v2025.8.17.0
5
+ 脚本:
6
+ * [修复] 尝试修复进入每日商店时报错的问题(#e9529b7)
7
+ * [修复] 修复刷新商店商品时脚本不会等待刷新完成的问题(#180d800)
8
+ * [修复] 修复商店刷新后第二次购买会跳过第一行的问题 #59(#a327791)
9
+ * [修复] 修复金币商店购买一个物品总是点击两次的问题(#94a264e)
10
+
11
+ 界面:
12
+ * [修复] 移除模拟器设置的最后多余的 Dropdown(#91d05b1)
13
+ * [修复] 移除培育方案中多余的培育次数输入框(#c0549d9)
14
+ * [新增] 新增保存设置提示(#b56eabc)
15
+
16
+ ### v2025.8.2.0
17
+ 脚本:
18
+ * [修复] 修复 DMM 版启动游戏提示找不到窗口的问题(#46e72c4)
19
+ * [重构] 将部分 while 循环用 Loop 类重写(#8c99955)
20
+
21
+ 界面:
22
+ * [新增] 模拟器列表懒加载(#0f18d36)
23
+ * [新增] 新增创建桌面快捷方式功能(#6640a21)
24
+ * [新增] 新增命令行参数 --start-immidiately(#c39dd79)
25
+
26
+ 启动器:
27
+ * [新增] 以管理员重启时跳过重复检查更新(#142d9ef)
28
+ * [新增] 启动器支持拖拽安装 whl 包(#11c75dc)
29
+
4
30
  ### v2025.7.27.1
5
31
  脚本:
6
32
  * [修复] 修复检测培育阶段函数过早返回的问题(#de1328c)
Binary file
Binary file