ksaa 2025.7.3.0__py3-none-any.whl → 2025.7.7.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 (188) hide show
  1. kotonebot/backend/bot.py +13 -2
  2. kotonebot/backend/context/context.py +23 -3
  3. kotonebot/client/device.py +0 -35
  4. kotonebot/config/base_config.py +2 -0
  5. kotonebot/kaa/common.py +29 -21
  6. kotonebot/kaa/game_ui/toolbar.py +3 -2
  7. kotonebot/kaa/main/gr.py +37 -8
  8. kotonebot/kaa/main/kaa.py +21 -0
  9. kotonebot/kaa/metadata.py +27 -0
  10. kotonebot/kaa/resources/__pycache__/__init__.cpython-310.pyc +0 -0
  11. kotonebot/kaa/resources/game.db +0 -0
  12. kotonebot/kaa/resources/game_ver.txt +0 -0
  13. kotonebot/kaa/resources/idol_cards/i_card-skin-hmsz-1-001_0.png +0 -0
  14. kotonebot/kaa/resources/idol_cards/i_card-skin-hmsz-1-001_1.png +0 -0
  15. kotonebot/kaa/resources/idol_cards/i_card-skin-hmsz-3-001_0.png +0 -0
  16. kotonebot/kaa/resources/idol_cards/i_card-skin-hmsz-3-001_1.png +0 -0
  17. kotonebot/kaa/resources/idol_cards/i_card-skin-hume-1-001_0.png +0 -0
  18. kotonebot/kaa/resources/idol_cards/i_card-skin-hume-1-001_1.png +0 -0
  19. kotonebot/kaa/resources/idol_cards/i_card-skin-jsna-1-001_0.png +0 -0
  20. kotonebot/kaa/resources/idol_cards/i_card-skin-jsna-1-001_1.png +0 -0
  21. kotonebot/kaa/resources/idol_cards/i_card-skin-jsna-3-007_0.png +0 -0
  22. kotonebot/kaa/resources/idol_cards/i_card-skin-jsna-3-007_1.png +0 -0
  23. kotonebot/kaa/sprites/0bf5e34e-afc6-4447-bbac-67026ce2ad26.png +0 -0
  24. kotonebot/kaa/sprites/0d9ac648-eefa-4869-ac99-1b0c83649681.png +0 -0
  25. kotonebot/kaa/sprites/185f7838-92a7-460b-9340-f60858948ce9.png +0 -0
  26. kotonebot/kaa/sprites/213016c2-c3a2-43d8-86a3-ab4d27666ced.png +0 -0
  27. kotonebot/kaa/sprites/24dc7158-036c-4a66-9280-e934f470be53.png +0 -0
  28. kotonebot/kaa/sprites/3942ae40-7f22-412c-aebe-4b064f68db9b.png +0 -0
  29. kotonebot/kaa/sprites/5031808b-5525-4118-92b4-317ec8bda985.png +0 -0
  30. kotonebot/kaa/sprites/5d36b880-7b3f-49b1-a018-7de59867d376.png +0 -0
  31. kotonebot/kaa/sprites/81c97cd3-df53-44d3-bf3d-1eb4dc67b62a.png +0 -0
  32. kotonebot/kaa/sprites/8f8b7b46-53bb-42ab-907a-4ea87eb09ab4.png +0 -0
  33. kotonebot/kaa/sprites/921eefeb-730e-46fc-9924-d338fb286592.png +0 -0
  34. kotonebot/kaa/sprites/ae9fe233-9acc-4e96-ba8e-1fb1d9bc2ea5.png +0 -0
  35. kotonebot/kaa/sprites/cb3d0ca7-8d14-408a-a2f5-2e25f7b86d6c.png +0 -0
  36. kotonebot/kaa/sprites/cc60b509-2ed5-493d-bb9f-333c6d2a6006.png +0 -0
  37. kotonebot/kaa/tasks/R.py +147 -153
  38. kotonebot/kaa/tasks/daily/acquire_activity_funds.py +12 -10
  39. kotonebot/kaa/tasks/daily/assignment.py +9 -11
  40. kotonebot/kaa/tasks/daily/purchase.py +52 -28
  41. kotonebot/kaa/tasks/produce/produce.py +12 -5
  42. {ksaa-2025.7.3.0.dist-info → ksaa-2025.7.7.0.dist-info}/METADATA +1 -1
  43. {ksaa-2025.7.3.0.dist-info → ksaa-2025.7.7.0.dist-info}/RECORD +173 -164
  44. kotonebot/kaa/sprites/047454d6-9cbb-432d-b670-bde2d5f5fc9a.png +0 -0
  45. kotonebot/kaa/sprites/135ee57a-d30d-4ba8-83f0-9f1681a49ff7.png +0 -0
  46. kotonebot/kaa/sprites/17608ef8-fe7c-4fc7-b811-a6c05e838881.png +0 -0
  47. kotonebot/kaa/sprites/278b7d9c-707e-4392-9677-74574b5cdf42.png +0 -0
  48. kotonebot/kaa/sprites/2bc00520-0afe-40e5-8743-d33fc6b2945a.png +0 -0
  49. kotonebot/kaa/sprites/404c6271-1af4-4f63-be02-e82b318eb072.png +0 -0
  50. kotonebot/kaa/sprites/6720b6e8-ae80-4cc0-a885-518efe12b707.png +0 -0
  51. kotonebot/kaa/sprites/685fb958-ec13-4826-8e78-3575ff42df27.png +0 -0
  52. kotonebot/kaa/sprites/699df701-37a2-4e17-afae-5b49ab826926.png +0 -0
  53. kotonebot/kaa/sprites/74ff07b3-d91c-4579-80cd-379ed7020622.png +0 -0
  54. kotonebot/kaa/sprites/868b97a9-492e-4712-b47f-82b97495b019.png +0 -0
  55. kotonebot/kaa/sprites/a7f5abf1-982f-4a55-8d41-3ad6f56798e0.png +0 -0
  56. kotonebot/kaa/sprites/afa06fdc-a345-4384-b25d-b16540830256.png +0 -0
  57. kotonebot/kaa/sprites/d15959bf-d07b-4f07-948a-c0aeaf17756a.png +0 -0
  58. kotonebot/kaa/sprites/ea0440b1-a7a5-4db0-828a-f907b0531cd5.png +0 -0
  59. /kotonebot/kaa/sprites/{7d7ccd61-8d92-49b4-aa7e-b1e73906371e.png → 0089161a-0dac-41da-97af-b9200339a383.png} +0 -0
  60. /kotonebot/kaa/sprites/{4466c3fe-a5ad-4960-a137-0d735441b12e.png → 025f1786-cd28-4a08-ad81-178d267dbb1a.png} +0 -0
  61. /kotonebot/kaa/sprites/{85347bb8-c28d-4a40-bd55-386c530727c2.png → 05d933de-6274-4d46-a81b-860de1981ebc.png} +0 -0
  62. /kotonebot/kaa/sprites/{76aca556-0042-4f84-a29a-30e6a631aa72.png → 06e7d3f6-1ab8-4714-8ab5-8af71dcbfa78.png} +0 -0
  63. /kotonebot/kaa/sprites/{7aa7c3dc-02e8-4d70-a026-d1afb34f37f9.png → 08f93e03-18c9-42e3-9a2f-7d7954f585b0.png} +0 -0
  64. /kotonebot/kaa/sprites/{02de663b-a039-4530-b10b-fd5aea9f600e.png → 0913f34e-1790-4afb-af31-9a5e94d54b05.png} +0 -0
  65. /kotonebot/kaa/sprites/{88ed3d25-070a-411d-b4fb-8a9df068b091.png → 0a3c0a4e-a979-401c-9bf3-a389e8a74e7b.png} +0 -0
  66. /kotonebot/kaa/sprites/{081ca89e-0f95-45e5-a855-5b7e49295af5.png → 0eb4e53c-f0af-4c86-870c-b1db087d53db.png} +0 -0
  67. /kotonebot/kaa/sprites/{abd7bfbf-5f08-452a-b216-22fb0af4e955.png → 10713c56-e462-4543-8a51-02f220ed6943.png} +0 -0
  68. /kotonebot/kaa/sprites/{7036c80b-28fd-4a54-a8f9-06a23d89e861.png → 119f04e2-3871-46a8-9d5c-808c641f7aae.png} +0 -0
  69. /kotonebot/kaa/sprites/{1fc998a7-cfa2-4485-9742-1ae87306a9fc.png → 126f5161-3567-4c76-8e91-371392e39a9c.png} +0 -0
  70. /kotonebot/kaa/sprites/{bba69e83-b9f4-4a24-a95b-190c985c5b22.png → 1762b8dc-abb8-402e-88b9-22111b054d27.png} +0 -0
  71. /kotonebot/kaa/sprites/{a5bd802e-d10c-4e95-9b62-1ffd92aca4ab.png → 177ee196-1013-487e-9944-64c4a9b803ef.png} +0 -0
  72. /kotonebot/kaa/sprites/{6af19ba1-ca74-473b-8788-61132e5fc084.png → 18369504-36b1-4b10-93e6-878c2cae6c8f.png} +0 -0
  73. /kotonebot/kaa/sprites/{1140cce1-90e4-44cd-9acc-c2491841fbd4.png → 1cd922b1-cd9c-4b60-b7e7-014c59217cb0.png} +0 -0
  74. /kotonebot/kaa/sprites/{612d508d-e77c-492e-854d-30141733bd27.png → 1cede0b7-5042-481c-b507-957dd98ec17a.png} +0 -0
  75. /kotonebot/kaa/sprites/{0e0686c7-9fe8-4f82-9d05-7922e55fc1a9.png → 1d714b45-6b20-40ba-8e0b-e7c106f0c8f3.png} +0 -0
  76. /kotonebot/kaa/sprites/{ada79928-ea1a-4537-89e7-a02877dc6e7d.png → 1e398be7-49ac-4eb6-b828-b935f042037a.png} +0 -0
  77. /kotonebot/kaa/sprites/{81bf65f2-9cc3-4613-9611-e7b5ec14c31c.png → 20748b0c-889f-4706-857b-48fc921a88e3.png} +0 -0
  78. /kotonebot/kaa/sprites/{c5447438-3b41-465e-b438-157f5e61c764.png → 2146a037-c3ad-4c33-834c-ddd7f3b7876c.png} +0 -0
  79. /kotonebot/kaa/sprites/{e3c1f79a-0077-43db-bd00-ba04d7ca8d3b.png → 2154ebd3-9c89-4355-b4f4-a5e18ecf728d.png} +0 -0
  80. /kotonebot/kaa/sprites/{276522a3-d8f0-4b0f-8ee5-dce3f2cb87a5.png → 21fe29c2-f49b-473f-8ac3-896b4d3c72f5.png} +0 -0
  81. /kotonebot/kaa/sprites/{ecdf7c70-d50e-41f4-a2ee-c4f6dd5a2617.png → 23464a7b-dc7a-439c-86b7-04a5dd506412.png} +0 -0
  82. /kotonebot/kaa/sprites/{4cca8c07-b33f-4f57-8c2b-3fff8cb4424a.png → 2712893d-0219-43e1-8de7-c2761456719e.png} +0 -0
  83. /kotonebot/kaa/sprites/{25598023-8999-4737-9f3c-9da71bb88748.png → 2d0ed04f-777a-4a69-9a58-0be791260dca.png} +0 -0
  84. /kotonebot/kaa/sprites/{e671d7bd-cf40-425f-b941-3e1adf4624e8.png → 2d4001e6-137e-40b2-94b0-ba3ae9e397e4.png} +0 -0
  85. /kotonebot/kaa/sprites/{5d8bbe9f-4732-495a-8d27-80cfd2ea12f5.png → 2ed453f3-9c31-4c96-95dd-1a6aa68302f7.png} +0 -0
  86. /kotonebot/kaa/sprites/{84af97ac-7e73-4ae8-88a6-9b3a18c81fbe.png → 2f4f3d81-2a8c-49d3-84a8-4d1205237ed4.png} +0 -0
  87. /kotonebot/kaa/sprites/{25151748-2eb2-4f08-94f1-f1be2fbea3da.png → 2ffd9c12-0520-4f9c-92b1-bfdef0681583.png} +0 -0
  88. /kotonebot/kaa/sprites/{a241cff0-d803-4c8f-bcd0-22bda2adc8a7.png → 308818b7-a252-45a6-868d-553c078b3752.png} +0 -0
  89. /kotonebot/kaa/sprites/{ab4cd19c-ad2b-4ed7-baeb-eef6a12939b2.png → 3091351b-ab63-4688-8082-32545052d7a8.png} +0 -0
  90. /kotonebot/kaa/sprites/{6be05914-aa45-4e55-a0bb-7ec16e76d7b1.png → 30ff50f2-7ab2-4a1d-88db-fd6deaba328e.png} +0 -0
  91. /kotonebot/kaa/sprites/{807904aa-30fd-4a9b-8acb-ca4b235281bc.png → 31dd40b0-1c07-4d6c-aabe-fd3e4895f4df.png} +0 -0
  92. /kotonebot/kaa/sprites/{7344f9d8-fccb-44e3-ab43-a180cfce2217.png → 3ddd0976-7c8b-4c67-bac7-a0cc1af3bfad.png} +0 -0
  93. /kotonebot/kaa/sprites/{46debd92-df4c-49d6-a3f6-c83a4c72be70.png → 3de5ce1b-f72b-450a-a1de-5a841fbd507a.png} +0 -0
  94. /kotonebot/kaa/sprites/{9bf5d8a8-30c1-4ce7-9888-bcada63d48e6.png → 3e9bdd08-3a74-40b3-8320-05ed4e8fe5d7.png} +0 -0
  95. /kotonebot/kaa/sprites/{99ae067f-72f2-4d13-a2de-f78ce13ec5a3.png → 4112f697-094b-4046-bfac-409f156784b0.png} +0 -0
  96. /kotonebot/kaa/sprites/{bc10fc41-960e-4151-aad2-325367b20895.png → 466524da-0d9e-424f-82eb-d6e6d3145bd3.png} +0 -0
  97. /kotonebot/kaa/sprites/{124fb25f-47ac-468d-97af-f90c9604f1c5.png → 4670fd78-3748-4df3-968b-25c8246da92b.png} +0 -0
  98. /kotonebot/kaa/sprites/{2b9fb35b-4a3b-440d-bcac-1eb1fdfe0e21.png → 467fe027-96ba-48b1-963b-75a5c41277c4.png} +0 -0
  99. /kotonebot/kaa/sprites/{9fb0b19e-ae0c-4c9e-8ec8-b126113b6091.png → 489feedd-f44e-4714-ad24-b53630dfcf27.png} +0 -0
  100. /kotonebot/kaa/sprites/{81a6e258-670c-4646-90ef-a76846cf5d37.png → 4abd8e80-83ef-4d1a-b143-e6ad0ac189ab.png} +0 -0
  101. /kotonebot/kaa/sprites/{f699ed29-e7aa-4c53-8320-3df785078ec3.png → 4d3e267c-552c-4a65-840a-dc72a61c8db1.png} +0 -0
  102. /kotonebot/kaa/sprites/{3bf0a104-739e-4bef-9304-4aa77e5e18ea.png → 4e040068-e2ae-4348-80a2-f113c2426d46.png} +0 -0
  103. /kotonebot/kaa/sprites/{689aa894-304a-48d2-8b6e-794dc967b1f6.png → 4eb9a3a1-da46-493b-a17d-5eb9ef53524c.png} +0 -0
  104. /kotonebot/kaa/sprites/{94b8429e-64d9-49da-945c-d2d3dcccb587.png → 51eac702-ca23-4aba-b75a-cdb03a93a117.png} +0 -0
  105. /kotonebot/kaa/sprites/{af4b7a1d-4cb2-432c-8dbb-c333950c58c2.png → 5200fbda-653d-4b6f-84d8-15793cc53684.png} +0 -0
  106. /kotonebot/kaa/sprites/{95e591bb-f0e6-457e-83e3-0909cb5c8877.png → 5367d7ad-5a27-42e4-a7d9-5bf27102f502.png} +0 -0
  107. /kotonebot/kaa/sprites/{0b452661-3720-4fa3-9e52-6fdc69517396.png → 54d71b39-a3f2-4f20-a294-b6b5ef9c56f3.png} +0 -0
  108. /kotonebot/kaa/sprites/{28f44641-894d-4047-bc56-b932ac5a32a0.png → 54f5e4d6-44f9-4249-bf80-aaaacf0a8d52.png} +0 -0
  109. /kotonebot/kaa/sprites/{540a0d73-7158-4872-808f-abcb11ba1aef.png → 5587551f-011c-4f94-86e8-7e81d08c4be2.png} +0 -0
  110. /kotonebot/kaa/sprites/{02048c24-3002-4122-b24b-15a2c2fb502f.png → 59997849-5a5a-4589-a4ff-e91a789fc68d.png} +0 -0
  111. /kotonebot/kaa/sprites/{0ad61c60-5458-400d-9788-437edb32608a.png → 5cff1e6f-81ea-4d4a-88ba-209cf3bbb165.png} +0 -0
  112. /kotonebot/kaa/sprites/{26b9efc1-51be-4784-bf78-2b929abac650.png → 5d5db2d4-2648-40fe-bd17-05aea9afbc7d.png} +0 -0
  113. /kotonebot/kaa/sprites/{3a4e2e77-c49b-4f69-bfd1-19fbe4f5c9a5.png → 5efa51e6-5cb7-4843-9397-8d71c6175fcf.png} +0 -0
  114. /kotonebot/kaa/sprites/{2a2770d2-7fd8-4bb0-89a7-c507046fc892.png → 6490c5b2-2ed8-44d6-93b8-72d88434b49e.png} +0 -0
  115. /kotonebot/kaa/sprites/{7d4d40cf-a6db-41ef-90fd-2fb0a6f5087d.png → 688d653e-7ee7-4d41-ac79-b4efd6c3cadd.png} +0 -0
  116. /kotonebot/kaa/sprites/{a6d63930-bb09-443c-95ae-47ad6a9f9cc4.png → 6a45398a-4240-4fb7-8926-fa1254125bbf.png} +0 -0
  117. /kotonebot/kaa/sprites/{a2ab29ef-ddc7-4885-9f88-850858b0c995.png → 6d4337f4-e30c-44eb-bab9-220a46c0c96f.png} +0 -0
  118. /kotonebot/kaa/sprites/{01ce8957-465d-4278-b297-f58b36c73285.png → 6df0db09-9159-43b5-a6b9-43a2dfdafdab.png} +0 -0
  119. /kotonebot/kaa/sprites/{0a586241-e005-45a6-b12f-eed8089d8fd8.png → 6f06519d-4f33-4418-b4cb-35a7356cc121.png} +0 -0
  120. /kotonebot/kaa/sprites/{6fc5543e-9d09-4f06-8331-64ee62bd73c3.png → 6f638005-aa18-4804-a5fe-269de4d1ad9e.png} +0 -0
  121. /kotonebot/kaa/sprites/{56a7aed8-6367-40dd-a6a1-fc8a840abd9b.png → 6faf9942-994d-418a-ae42-25c5fcffa79e.png} +0 -0
  122. /kotonebot/kaa/sprites/{28ea2cc9-e9f2-4573-968a-0c88562c696a.png → 7315c6b9-6fda-4790-8e9a-c8c4220834e1.png} +0 -0
  123. /kotonebot/kaa/sprites/{71fe9437-3d7a-4321-9e5c-d6b81d954002.png → 76f43a30-b76d-4648-91b6-49f2786e668d.png} +0 -0
  124. /kotonebot/kaa/sprites/{3037118b-4a82-4cfc-ad95-db8a03f779d5.png → 774ca489-09c2-414e-b27b-f32d3bf6894d.png} +0 -0
  125. /kotonebot/kaa/sprites/{33aaec9e-dccc-441a-b91a-4784f1eb4498.png → 78c0f6b4-c09d-4b44-9b5e-35e1e40dd748.png} +0 -0
  126. /kotonebot/kaa/sprites/{f1758956-6b88-49f7-9ecf-44db49d1e6fe.png → 7c40ea85-87f6-4531-a25a-896dd70b49d1.png} +0 -0
  127. /kotonebot/kaa/sprites/{0db398fd-3551-4a15-b734-ca5a7b54150f.png → 7dd1c478-719f-4432-891f-9543064fd1fc.png} +0 -0
  128. /kotonebot/kaa/sprites/{e2d3a8c0-3998-4643-b084-c21b2304843c.png → 80c45554-0758-47eb-b9d7-d8c10f462ae5.png} +0 -0
  129. /kotonebot/kaa/sprites/{fccea764-f5db-45c6-ace1-140844e0d0f0.png → 8308964d-96d1-4b7e-b0fa-b20163311153.png} +0 -0
  130. /kotonebot/kaa/sprites/{f92f9af7-77ef-4814-a64b-ce8f340a9cf9.png → 835a1f3e-5a06-4490-bc2e-c6d3d8edc1fd.png} +0 -0
  131. /kotonebot/kaa/sprites/{540547f7-5633-440c-b7ad-b54529436479.png → 84c0f8bf-c670-47d4-8d5c-06de599f7c40.png} +0 -0
  132. /kotonebot/kaa/sprites/{dd4c523c-1286-4f68-89f5-371464aa138c.png → 87a59b06-0ac7-4a35-93c4-3705bf9e774a.png} +0 -0
  133. /kotonebot/kaa/sprites/{e703f139-9612-4e4a-be30-db32423d57d9.png → 898325da-307d-4108-ab4c-25d9ae94ee24.png} +0 -0
  134. /kotonebot/kaa/sprites/{501eaf11-021e-4764-93ed-0be6ea0ed5df.png → 899ad2c0-7b23-4b77-aed4-34ba4911672b.png} +0 -0
  135. /kotonebot/kaa/sprites/{1a4c5291-70a9-4923-aadf-f7e6a28c7aa5.png → 97e33fa0-1442-418d-b393-3b916312c9e1.png} +0 -0
  136. /kotonebot/kaa/sprites/{6a7eacf1-f14e-45cf-8ef7-7f933d4fa664.png → 99b58811-42ff-415b-9229-f5c75cbe1a1a.png} +0 -0
  137. /kotonebot/kaa/sprites/{1470cd16-3340-4a0a-854f-3acf9b882cb1.png → 9d94c24c-5aab-4fb6-8fa7-902cebac134c.png} +0 -0
  138. /kotonebot/kaa/sprites/{62a4c9fd-35e6-4982-b9f4-e3a5685eac13.png → 9e861b2e-f896-4738-b0d0-9b703395720d.png} +0 -0
  139. /kotonebot/kaa/sprites/{ed331876-f724-4a9f-a494-7823be883a76.png → a586f586-85e9-439e-ab3f-905d6cbe6746.png} +0 -0
  140. /kotonebot/kaa/sprites/{ce0df3fa-5d88-4b20-9cf1-6b4abac4c110.png → acd01a53-c689-4ffd-ae45-744a37c70197.png} +0 -0
  141. /kotonebot/kaa/sprites/{4fe4fbf2-4dbf-44d2-8dd6-a3f3c9f0d1b7.png → acd1a611-f93d-4d32-8070-dc325b42eeb9.png} +0 -0
  142. /kotonebot/kaa/sprites/{6f342de5-b179-4120-ab6d-404c3eee5caa.png → adf0eea7-a052-410b-b479-8c672ae38268.png} +0 -0
  143. /kotonebot/kaa/sprites/{49e46cda-a6ac-44c8-8901-60956ca5151d.png → af0f65a5-8d32-4211-86df-66b3fa609462.png} +0 -0
  144. /kotonebot/kaa/sprites/{2a0e9656-26ba-4d7a-a414-6045e521b92c.png → b2743383-a3e4-43ff-82a3-3c7c6450fc50.png} +0 -0
  145. /kotonebot/kaa/sprites/{e89906b2-7354-4724-80ef-7c7fe5cd3ef5.png → b2f31f86-b7ae-4eb1-8042-d14c5b226714.png} +0 -0
  146. /kotonebot/kaa/sprites/{2fc3fa82-cc3d-4164-839f-d0bd7f8a32f5.png → b720a22b-a2f1-4686-969d-2a2edd8fb96b.png} +0 -0
  147. /kotonebot/kaa/sprites/{277035b5-7eee-4ca8-80dd-f73d78e7531f.png → b73fa422-bf9c-43aa-ad80-ae92286042e6.png} +0 -0
  148. /kotonebot/kaa/sprites/{9b425fee-9118-4015-9242-29bf1150e704.png → b974e1ac-1f24-4498-aa84-62cb5c0984e7.png} +0 -0
  149. /kotonebot/kaa/sprites/{f897b52f-b9d8-4d94-9d98-1ed6bf7b6c76.png → bad07ebd-c8e7-4721-ab74-a38fa30e0401.png} +0 -0
  150. /kotonebot/kaa/sprites/{884a25c2-7b98-4a33-a975-6f918a8301aa.png → bbfb7670-2537-4a92-9a39-487d174f27a0.png} +0 -0
  151. /kotonebot/kaa/sprites/{bf44c221-0af9-497e-a2e8-cdc497348257.png → bcb990e6-58ae-460d-859a-812b4121e716.png} +0 -0
  152. /kotonebot/kaa/sprites/{74e207b4-a13e-47cc-bf23-dbf77089ea3c.png → bfd495eb-7ec2-47d7-aff2-59c1a663be5d.png} +0 -0
  153. /kotonebot/kaa/sprites/{441c2df2-43ac-4ff3-814e-6230c510bce6.png → c1336997-ea27-4d53-9c64-826ca7eca11f.png} +0 -0
  154. /kotonebot/kaa/sprites/{1db583b2-c82a-4576-9ca9-b7409bc1ca95.png → c639b2f6-35f2-4924-9e81-878637c176a6.png} +0 -0
  155. /kotonebot/kaa/sprites/{bc94b664-bbcf-4b59-8e4b-7dbf03997309.png → c686d99a-248a-460b-a4fe-2fa5b8e9660b.png} +0 -0
  156. /kotonebot/kaa/sprites/{43550662-cd46-4312-b18b-949cba98d173.png → c692a9b3-8a2a-42f1-8f63-ad8bd553272d.png} +0 -0
  157. /kotonebot/kaa/sprites/{d2a8f04f-38c1-4a67-8c57-43e0334887ef.png → c7e90767-3661-4e86-8c54-8e1d1e83d113.png} +0 -0
  158. /kotonebot/kaa/sprites/{feb8f473-8a2e-40a5-b6e0-dffafd35edc1.png → c9e507d5-94dd-4ff3-b995-70c6cb360095.png} +0 -0
  159. /kotonebot/kaa/sprites/{559485ee-a27f-4824-ad7a-e57d0c613ed5.png → cdc6e5e2-5b38-4471-b23f-17ec229268db.png} +0 -0
  160. /kotonebot/kaa/sprites/{62031705-40e0-4b74-b7b9-07f1fffd122f.png → d07f0d30-465e-4b4e-803f-a81aeabdd1e8.png} +0 -0
  161. /kotonebot/kaa/sprites/{44430184-c35e-4bb8-8858-ed5cec580c36.png → d108794a-60b8-4637-bced-84f46140eaac.png} +0 -0
  162. /kotonebot/kaa/sprites/{db375f07-c682-4aae-880a-a2cf13d0dac0.png → d43f214a-4db4-4222-941c-3d3216a0c0c3.png} +0 -0
  163. /kotonebot/kaa/sprites/{ee7f4e24-6cbc-41ed-9327-d6843ac6a820.png → d5899bda-b311-469d-b4fb-963799ef1720.png} +0 -0
  164. /kotonebot/kaa/sprites/{c696843a-1e17-4c0d-a92c-eb54f9356daf.png → d7d6ace9-35f1-4c71-b4c1-9de938b254f4.png} +0 -0
  165. /kotonebot/kaa/sprites/{359e43b3-6b85-4f8c-86a1-4d4c1ae75779.png → dd431a8a-3ffa-43d6-96c6-4e84aa946b72.png} +0 -0
  166. /kotonebot/kaa/sprites/{e47acec2-3466-419a-acad-30618239aab9.png → dfb1d18d-b768-46c4-9d31-b654ba7a2b6d.png} +0 -0
  167. /kotonebot/kaa/sprites/{69266fc9-c8fe-48ea-8d68-8ace8c606049.png → e007420c-b92b-414c-96a3-d556e3c25cb2.png} +0 -0
  168. /kotonebot/kaa/sprites/{f6063ed7-f59e-4c37-93e2-026c805826ea.png → e614c8e1-1d7b-4535-a8ba-cbf09fd5b163.png} +0 -0
  169. /kotonebot/kaa/sprites/{bff85e9a-df48-429f-a82e-ceff41f8527b.png → e64c9477-35f7-4f05-995f-f3f38bb7db66.png} +0 -0
  170. /kotonebot/kaa/sprites/{109ff896-1f96-465a-ad6f-ef410789e140.png → e6a16a1e-e821-45f0-bc64-f2e0dab7efd7.png} +0 -0
  171. /kotonebot/kaa/sprites/{b5d02984-ec1f-48f5-8593-0bc0e4babc1f.png → e6d0979a-cd27-4933-b528-7777be525ace.png} +0 -0
  172. /kotonebot/kaa/sprites/{a53820f6-1572-413a-b7b1-2bc08690884f.png → e798ff2f-6f30-4536-923a-a65433817423.png} +0 -0
  173. /kotonebot/kaa/sprites/{24cdb395-915e-4816-9406-efd1aafa70c1.png → e87f0760-4bc9-4d7f-91e2-5452ba0fcd9d.png} +0 -0
  174. /kotonebot/kaa/sprites/{a388f87d-9a69-4189-b80a-e230d7d7b964.png → e93a983d-b869-45e4-8a5c-cd1c9d511b11.png} +0 -0
  175. /kotonebot/kaa/sprites/{156d67bb-562c-42df-b55a-aea0b6ad71dd.png → f18c683d-1eb2-4279-a05c-c411683354df.png} +0 -0
  176. /kotonebot/kaa/sprites/{c4985caa-1e42-4980-9a76-a660a7b12c67.png → f26d4e09-2511-48e4-9c69-ba413ddf65e1.png} +0 -0
  177. /kotonebot/kaa/sprites/{2fd135e1-8010-4a53-90a3-2a950c5a43bf.png → f2d614b3-d3bf-4340-b261-f4c385a59e4e.png} +0 -0
  178. /kotonebot/kaa/sprites/{982d2e5d-4493-44a5-b922-e71649fd6bc5.png → f3e4e9ec-ddd6-42c4-9638-b93ff4e6b514.png} +0 -0
  179. /kotonebot/kaa/sprites/{0a0dfcba-7ae4-415a-9361-7f3c4ec16ef9.png → f5917c99-185e-4bd9-b367-972c77accb44.png} +0 -0
  180. /kotonebot/kaa/sprites/{a26dc021-2a28-4f79-bd11-48c4a1261f0d.png → f957edb2-3534-4d1d-a9be-70b478b2ff63.png} +0 -0
  181. /kotonebot/kaa/sprites/{ac4579ad-2000-4283-8e13-53fe525725bf.png → f9b38a5e-72cb-4b18-8817-18473effd41d.png} +0 -0
  182. /kotonebot/kaa/sprites/{cc959ce4-8619-4bd7-8a85-02f97cf6cc51.png → f9e8cde8-fda0-4436-8072-6bc32c3c0b8e.png} +0 -0
  183. /kotonebot/kaa/sprites/{525b6f3a-acc8-4bd8-be4b-cc1f44fb377a.png → fc44214e-ef8a-4ea1-baec-35674ce0c4d6.png} +0 -0
  184. /kotonebot/kaa/sprites/{3ea8a020-5605-47ce-8d3a-d812d0583058.png → fffa0118-dd3a-4d01-8c4e-d43182778391.png} +0 -0
  185. {ksaa-2025.7.3.0.dist-info → ksaa-2025.7.7.0.dist-info}/WHEEL +0 -0
  186. {ksaa-2025.7.3.0.dist-info → ksaa-2025.7.7.0.dist-info}/entry_points.txt +0 -0
  187. {ksaa-2025.7.3.0.dist-info → ksaa-2025.7.7.0.dist-info}/licenses/LICENSE +0 -0
  188. {ksaa-2025.7.3.0.dist-info → ksaa-2025.7.7.0.dist-info}/top_level.txt +0 -0
kotonebot/backend/bot.py CHANGED
@@ -145,6 +145,18 @@ class KotoneBot:
145
145
  """
146
146
  raise NotImplementedError('Implement `_create_device` before using Kotonebot.')
147
147
 
148
+ def _on_init_context(self) -> None:
149
+ """
150
+ 初始化 Context 的钩子方法。子类可以重写此方法来自定义初始化逻辑。
151
+ 默认实现调用 init_context 而不传入 target_screenshot_interval。
152
+ """
153
+ d = self._on_create_device()
154
+ init_context(
155
+ config_path=self.config_path,
156
+ config_type=self.config_type,
157
+ target_device=d
158
+ )
159
+
148
160
  def _on_after_init_context(self):
149
161
  """
150
162
  抽象方法,在 init_context() 被调用后立即执行。
@@ -155,8 +167,7 @@ class KotoneBot:
155
167
  """
156
168
  按优先级顺序运行所有任务。
157
169
  """
158
- d = self._on_create_device()
159
- init_context(config_path=self.config_path, config_type=self.config_type, target_device=d)
170
+ self._on_init_context()
160
171
  self._on_after_init_context()
161
172
  vars.flow.clear_interrupt()
162
173
 
@@ -27,6 +27,7 @@ from cv2.typing import MatLike
27
27
 
28
28
  from kotonebot.client.device import Device, AndroidDevice, WindowsDevice
29
29
  from kotonebot.backend.flow_controller import FlowController
30
+ from kotonebot.util import Interval
30
31
  import kotonebot.backend.image as raw_image
31
32
  from kotonebot.backend.image import (
32
33
  TemplateMatchResult,
@@ -718,8 +719,20 @@ class Forwarded:
718
719
 
719
720
  T_Device = TypeVar('T_Device', bound=Device)
720
721
  class ContextDevice(Generic[T_Device], Device):
721
- def __init__(self, device: T_Device):
722
+ def __init__(self, device: T_Device, target_screenshot_interval: float | None = None):
723
+ """
724
+ :param device: 目标设备。
725
+ :param target_screenshot_interval: 见 `ContextDevice.target_screenshot_interval`。
726
+ """
722
727
  self._device = device
728
+ self.target_screenshot_interval: float | None = target_screenshot_interval
729
+ """
730
+ 目标截图间隔,可用于限制截图速度。若两次截图实际间隔小于该值,则会自动等待。
731
+ 为 None 时不限制截图速度。
732
+ """
733
+ self._screenshot_interval: Interval | None = None
734
+ if self.target_screenshot_interval is not None:
735
+ self._screenshot_interval = Interval(self.target_screenshot_interval)
723
736
 
724
737
  def screenshot(self, *, force: bool = False):
725
738
  """
@@ -734,6 +747,9 @@ class ContextDevice(Generic[T_Device], Device):
734
747
  img = current._inherit_screenshot
735
748
  current._inherit_screenshot = None
736
749
  else:
750
+ if self._screenshot_interval is not None:
751
+ self._screenshot_interval.wait()
752
+
737
753
  if next_wait == 'screenshot':
738
754
  delta = time.time() - last_screenshot_time
739
755
  if delta < next_wait_time:
@@ -780,7 +796,8 @@ class Context(Generic[T]):
780
796
  self,
781
797
  config_path: str,
782
798
  config_type: Type[T],
783
- device: Device
799
+ device: Device,
800
+ target_screenshot_interval: float | None = None
784
801
  ):
785
802
  self.__ocr = ContextOcr(self)
786
803
  self.__image = ContextImage(self)
@@ -788,7 +805,7 @@ class Context(Generic[T]):
788
805
  self.__vars = ContextGlobalVars()
789
806
  self.__debug = ContextDebug(self)
790
807
  self.__config = ContextConfig[T](self, config_path, config_type)
791
- self.__device = ContextDevice(device)
808
+ self.__device = ContextDevice(device, target_screenshot_interval)
792
809
 
793
810
  def inject(
794
811
  self,
@@ -900,6 +917,7 @@ def init_context(
900
917
  config_type: Type[T] = dict[str, Any],
901
918
  force: bool = False,
902
919
  target_device: Device,
920
+ target_screenshot_interval: float | None = None,
903
921
  ):
904
922
  """
905
923
  初始化 Context 模块。
@@ -911,6 +929,7 @@ def init_context(
911
929
  :param force: 是否强制重新初始化。
912
930
  若为 `True`,则忽略已存在的 Context 实例,并重新创建一个新的实例。
913
931
  :param target_device: 目标设备
932
+ :param target_screenshot_interval: 见 `ContextDevice.target_screenshot_interval`。
914
933
  """
915
934
  global _c, device, ocr, image, color, vars, debug, config
916
935
  if _c is not None and not force:
@@ -919,6 +938,7 @@ def init_context(
919
938
  config_path=config_path,
920
939
  config_type=config_type,
921
940
  device=target_device,
941
+ target_screenshot_interval=target_screenshot_interval,
922
942
  )
923
943
  device._FORWARD_getter = lambda: _c.device # type: ignore
924
944
  ocr._FORWARD_getter = lambda: _c.ocr # type: ignore
@@ -29,31 +29,6 @@ class HookContextManager:
29
29
  def __exit__(self, exc_type, exc_value, traceback):
30
30
  self.device.screenshot_hook_after = self.old_func
31
31
 
32
-
33
- class PinContextManager:
34
- def __init__(self, device: 'Device'):
35
- self.device = device
36
- self.old_hook = device.screenshot_hook_before
37
- self.memo = None
38
-
39
- def __hook(self) -> MatLike:
40
- if self.memo is None:
41
- self.memo = self.device.screenshot_raw()
42
- return self.memo
43
-
44
- def __enter__(self):
45
- self.device.screenshot_hook_before = self.__hook
46
- return self
47
-
48
- def __exit__(self, exc_type, exc_value, traceback):
49
- self.device.screenshot_hook_before = self.old_hook
50
-
51
- def update(self) -> None:
52
- """
53
- 更新记住的截图
54
- """
55
- self.memo = self.device.screenshot_raw()
56
-
57
32
  class Device:
58
33
  def __init__(self, platform: str = 'unknown') -> None:
59
34
  self.screenshot_hook_after: Callable[[MatLike], MatLike] | None = None
@@ -356,16 +331,6 @@ class Device:
356
331
  """
357
332
  return HookContextManager(self, func)
358
333
 
359
- @deprecated('改用 @task/@action 装饰器中的 screenshot_mode 参数')
360
- def pinned(self) -> PinContextManager:
361
- """
362
- 记住下次截图结果,并将截图调整为手动挡。
363
- 之后截图都会返回记住的数据,节省重复截图时间。
364
-
365
- 调用返回对象中的 PinContextManager.update() 可以立刻更新记住的截图。
366
- """
367
- return PinContextManager(self)
368
-
369
334
  @property
370
335
  def screen_size(self) -> tuple[int, int]:
371
336
  """
@@ -50,6 +50,8 @@ class BackendConfig(ConfigBaseModel):
50
50
  """Windows 截图方式的 AutoHotkey 可执行文件路径,为 None 时使用默认路径"""
51
51
  mumu_background_mode: bool = False
52
52
  """MuMu12 模拟器后台保活模式"""
53
+ target_screenshot_interval: float | None = None
54
+ """最小截图间隔,单位为秒。为 None 时不限制截图速度。"""
53
55
 
54
56
  class PushConfig(ConfigBaseModel):
55
57
  """推送配置。"""
kotonebot/kaa/common.py CHANGED
@@ -80,7 +80,7 @@ class DailyMoneyShopItems(IntEnum):
80
80
  """紫云清夏 Tame-Lie-One-Step 碎片"""
81
81
  IdolPiece_葛城リーリヤ_白線 = 17
82
82
  """葛城リーリヤ 白線 碎片"""
83
- IdolPiece_姫崎薪波_cIclumsy_trick = 18
83
+ IdolPiece_姬崎莉波_clumsy_trick = 18
84
84
  """姫崎薪波 cIclumsy trick 碎片"""
85
85
  IdolPiece_花海咲季_FightingMyWay = 19
86
86
  """花海咲季 FightingMyWay 碎片"""
@@ -90,6 +90,8 @@ class DailyMoneyShopItems(IntEnum):
90
90
  """花海佑芽 The Rolling Riceball 碎片"""
91
91
  IdolPiece_月村手毬_LunaSayMaybe = 22
92
92
  """月村手毬 Luna say maybe 碎片"""
93
+ IdolPiece_有村麻央_Fluorite = 23
94
+ """有村麻央 Fluorite 碎片"""
93
95
 
94
96
  @classmethod
95
97
  def to_ui_text(cls, item: "DailyMoneyShopItems") -> str:
@@ -126,23 +128,25 @@ class DailyMoneyShopItems(IntEnum):
126
128
  case cls.RecordKey:
127
129
  return "记录钥匙"
128
130
  case cls.IdolPiece_倉本千奈_WonderScale:
129
- return "倉本千奈 WonderScale 碎片"
131
+ return "倉本千奈 WonderScale 碎片"
130
132
  case cls.IdolPiece_篠泽广_光景:
131
- return "篠泽广 光景 碎片"
133
+ return "篠泽广 光景 碎片"
132
134
  case cls.IdolPiece_紫云清夏_TameLieOneStep:
133
- return "紫云清夏 Tame-Lie-One-Step 碎片"
135
+ return "紫云清夏 Tame-Lie-One-Step 碎片"
134
136
  case cls.IdolPiece_葛城リーリヤ_白線:
135
- return "葛城リーリヤ 白線 碎片"
136
- case cls.IdolPiece_姫崎薪波_cIclumsy_trick:
137
- return "姫崎薪波 cIclumsy trick 碎片"
137
+ return "葛城リーリヤ 白線 碎片"
138
+ case cls.IdolPiece_姬崎莉波_clumsy_trick:
139
+ return "姫崎薪波 clumsy trick 碎片"
138
140
  case cls.IdolPiece_花海咲季_FightingMyWay:
139
- return "花海咲季 FightingMyWay 碎片"
141
+ return "花海咲季 FightingMyWay 碎片"
140
142
  case cls.IdolPiece_藤田ことね_世界一可愛い私:
141
- return "藤田ことね 世界一可愛い私 碎片"
143
+ return "藤田ことね 世界一可愛い私 碎片"
142
144
  case cls.IdolPiece_花海佑芽_TheRollingRiceball:
143
- return "花海佑芽 The Rolling Riceball 碎片"
145
+ return "花海佑芽 The Rolling Riceball 碎片"
144
146
  case cls.IdolPiece_月村手毬_LunaSayMaybe:
145
- return "月村手毬 Luna say maybe 碎片"
147
+ return "月村手毬 Luna say maybe 碎片"
148
+ case cls.IdolPiece_有村麻央_Fluorite:
149
+ return "有村麻央 Fluorite 碎片"
146
150
  case _:
147
151
  assert_never(item)
148
152
 
@@ -202,8 +206,8 @@ class DailyMoneyShopItems(IntEnum):
202
206
  return R.Shop.IdolPiece.紫云清夏_TameLieOneStep
203
207
  case DailyMoneyShopItems.IdolPiece_葛城リーリヤ_白線:
204
208
  return R.Shop.IdolPiece.葛城リーリヤ_白線
205
- case DailyMoneyShopItems.IdolPiece_姫崎薪波_cIclumsy_trick:
206
- return R.Shop.IdolPiece.姫崎薪波_cIclumsy_trick
209
+ case DailyMoneyShopItems.IdolPiece_姬崎莉波_clumsy_trick:
210
+ return R.Shop.IdolPiece.姬崎莉波_clumsy_trick
207
211
  case DailyMoneyShopItems.IdolPiece_花海咲季_FightingMyWay:
208
212
  return R.Shop.IdolPiece.花海咲季_FightingMyWay
209
213
  case DailyMoneyShopItems.IdolPiece_藤田ことね_世界一可愛い私:
@@ -212,6 +216,8 @@ class DailyMoneyShopItems(IntEnum):
212
216
  return R.Shop.IdolPiece.花海佑芽_TheRollingRiceball
213
217
  case DailyMoneyShopItems.IdolPiece_月村手毬_LunaSayMaybe:
214
218
  return R.Shop.IdolPiece.月村手毬_LunaSayMaybe
219
+ case DailyMoneyShopItems.IdolPiece_有村麻央_Fluorite:
220
+ return R.Shop.IdolPiece.有村麻央_Fluorite
215
221
  case _:
216
222
  assert_never(self)
217
223
 
@@ -225,13 +231,9 @@ class PurchaseConfig(ConfigBaseModel):
225
231
  """是否启用金币购买"""
226
232
  money_items: list[DailyMoneyShopItems] = []
227
233
  """金币商店要购买的物品"""
228
- money_refresh_on: Literal['never', 'not_found', 'always'] = 'never'
234
+ money_refresh: bool = True
229
235
  """
230
- 金币商店刷新逻辑。
231
-
232
- * never: 从不刷新。
233
- * not_found: 仅当要购买的物品不存在时刷新。
234
- * always: 总是刷新。
236
+ 是否使用每日一次免费刷新金币商店。
235
237
  """
236
238
  ap_enabled: bool = False
237
239
  """是否启用AP购买"""
@@ -465,16 +467,22 @@ class MiscConfig(ConfigBaseModel):
465
467
  check_update: Literal['never', 'startup'] = 'startup'
466
468
  """
467
469
  检查更新时机。
468
-
470
+
469
471
  * never: 从不检查更新。
470
472
  * startup: 启动时检查更新。
471
473
  """
472
474
  auto_install_update: bool = True
473
475
  """
474
476
  是否自动安装更新。
475
-
477
+
476
478
  若启用,则每次自动检查更新时若有新版本会自动安装,否则只是会提示。
477
479
  """
480
+ expose_to_lan: bool = False
481
+ """
482
+ 是否允许局域网访问 Web 界面。
483
+
484
+ 启用后,局域网内的其他设备可以通过本机 IP 地址访问 Web 界面。
485
+ """
478
486
 
479
487
  class BaseConfig(ConfigBaseModel):
480
488
  purchase: PurchaseConfig = PurchaseConfig()
@@ -34,10 +34,11 @@ def toolbar_menu(critical: Literal[True]) -> TemplateMatchResult:
34
34
  """寻找工具栏上的菜单按钮。若未找到,则抛出异常。"""
35
35
  ...
36
36
 
37
+ _TOOLBAR_THRESHOLD = 0.6
37
38
  @action('工具栏按钮.寻找菜单', screenshot_mode='manual-inherit')
38
39
  def toolbar_menu(critical: bool = False):
39
40
  device.screenshot()
40
41
  if critical:
41
- return image.expect_wait(R.Common.ButtonToolbarMenu, preprocessors=[WhiteFilter()])
42
+ return image.expect_wait(R.Common.ButtonToolbarMenu, preprocessors=[WhiteFilter()], threshold=_TOOLBAR_THRESHOLD)
42
43
  else:
43
- return image.find(R.Common.ButtonToolbarMenu, preprocessors=[WhiteFilter()])
44
+ return image.find(R.Common.ButtonToolbarMenu, preprocessors=[WhiteFilter()], threshold=_TOOLBAR_THRESHOLD)
kotonebot/kaa/main/gr.py CHANGED
@@ -37,12 +37,12 @@ ConfigKey = Literal[
37
37
  'check_emulator', 'emulator_path',
38
38
  'adb_emulator_name', 'emulator_args',
39
39
  '_mumu_index', '_leidian_index',
40
- 'mumu_background_mode',
40
+ 'mumu_background_mode', 'target_screenshot_interval',
41
41
 
42
42
  # purchase
43
43
  'purchase_enabled',
44
44
  'money_enabled', 'ap_enabled',
45
- 'ap_items', 'money_items',
45
+ 'ap_items', 'money_items', 'money_refresh',
46
46
 
47
47
  # assignment
48
48
  'assignment_enabled',
@@ -92,8 +92,8 @@ ConfigKey = Literal[
92
92
  'trace_recommend_card_detection',
93
93
 
94
94
  # misc
95
- 'check_update', 'auto_install_update',
96
-
95
+ 'check_update', 'auto_install_update', 'expose_to_lan',
96
+
97
97
  '_selected_backend_index'
98
98
 
99
99
  ]
@@ -761,6 +761,15 @@ class KotoneBotUI:
761
761
  interactive=True
762
762
  )
763
763
 
764
+ target_screenshot_interval = gr.Number(
765
+ label="最小截图间隔(秒)",
766
+ value=self.current_config.backend.target_screenshot_interval,
767
+ info=BackendConfig.model_fields['target_screenshot_interval'].description,
768
+ minimum=0,
769
+ step=0.1,
770
+ interactive=True
771
+ )
772
+
764
773
  tab_mumu12.select(fn=partial(_update_emulator_tab_options, selected_index=0), inputs=[screenshot_impl], outputs=[screenshot_impl])
765
774
  tab_leidian.select(fn=partial(_update_emulator_tab_options, selected_index=1), inputs=[screenshot_impl], outputs=[screenshot_impl])
766
775
  tab_custom.select(fn=partial(_update_emulator_tab_options, selected_index=2), inputs=[screenshot_impl], outputs=[screenshot_impl])
@@ -814,12 +823,14 @@ class KotoneBotUI:
814
823
 
815
824
  # Common settings for all backend types
816
825
  self.current_config.backend.screenshot_impl = data['screenshot_method']
826
+ self.current_config.backend.target_screenshot_interval = data['target_screenshot_interval']
817
827
  self.current_config.keep_screenshots = data['keep_screenshots'] # This is a UserConfig field
818
828
 
819
829
  return set_config, {
820
830
  'adb_ip': adb_ip,
821
831
  'adb_port': adb_port,
822
832
  'screenshot_method': screenshot_impl, # screenshot_impl is the component
833
+ 'target_screenshot_interval': target_screenshot_interval,
823
834
  'keep_screenshots': keep_screenshots,
824
835
  'check_emulator': check_emulator,
825
836
  'emulator_path': emulator_path,
@@ -854,6 +865,12 @@ class KotoneBotUI:
854
865
  info=PurchaseConfig.model_fields['money_items'].description
855
866
  )
856
867
 
868
+ money_refresh = gr.Checkbox(
869
+ label="每日一次免费刷新金币商店",
870
+ value=self.current_config.options.purchase.money_refresh,
871
+ info=PurchaseConfig.model_fields['money_refresh'].description
872
+ )
873
+
857
874
  ap_enabled = gr.Checkbox(
858
875
  label="启用AP购买",
859
876
  value=self.current_config.options.purchase.ap_enabled,
@@ -891,6 +908,7 @@ class KotoneBotUI:
891
908
  config.purchase.enabled = data['purchase_enabled']
892
909
  config.purchase.money_enabled = data['money_enabled']
893
910
  config.purchase.money_items = [DailyMoneyShopItems(x) for x in data['money_items']]
911
+ config.purchase.money_refresh = data['money_refresh']
894
912
  config.purchase.ap_enabled = data['ap_enabled']
895
913
  ap_items_enum: List[Literal[0, 1, 2, 3]] = []
896
914
  ap_items_map: Dict[str, APShopItems] = {
@@ -909,7 +927,8 @@ class KotoneBotUI:
909
927
  'money_enabled': money_enabled,
910
928
  'ap_enabled': ap_enabled,
911
929
  'ap_items': ap_items,
912
- 'money_items': money_items
930
+ 'money_items': money_items,
931
+ 'money_refresh': money_refresh
913
932
  }
914
933
 
915
934
  def _create_work_settings(self) -> ConfigBuilderReturnValue:
@@ -1494,14 +1513,22 @@ class KotoneBotUI:
1494
1513
  info=MiscConfig.model_fields['auto_install_update'].description,
1495
1514
  interactive=True
1496
1515
  )
1497
-
1516
+ expose_to_lan = gr.Checkbox(
1517
+ label="允许局域网访问",
1518
+ value=self.current_config.options.misc.expose_to_lan,
1519
+ info=MiscConfig.model_fields['expose_to_lan'].description,
1520
+ interactive=True
1521
+ )
1522
+
1498
1523
  def set_config(config: BaseConfig, data: dict[ConfigKey, Any]) -> None:
1499
1524
  config.misc.check_update = data['check_update']
1500
1525
  config.misc.auto_install_update = data['auto_install_update']
1526
+ config.misc.expose_to_lan = data['expose_to_lan']
1501
1527
 
1502
1528
  return set_config, {
1503
1529
  'check_update': check_update,
1504
- 'auto_install_update': auto_install_update
1530
+ 'auto_install_update': auto_install_update,
1531
+ 'expose_to_lan': expose_to_lan
1505
1532
  }
1506
1533
 
1507
1534
  def _create_settings_tab(self) -> None:
@@ -1888,7 +1915,9 @@ def main(kaa: Kaa | None = None) -> None:
1888
1915
  kaa = kaa or Kaa('./config.json')
1889
1916
  ui = KotoneBotUI(kaa)
1890
1917
  app = ui.create_ui()
1891
- app.launch(inbrowser=True, show_error=True)
1918
+
1919
+ server_name = "0.0.0.0" if ui.current_config.options.misc.expose_to_lan else "127.0.0.1"
1920
+ app.launch(inbrowser=True, show_error=True, server_name=server_name)
1892
1921
 
1893
1922
  if __name__ == "__main__":
1894
1923
  main()
kotonebot/kaa/main/kaa.py CHANGED
@@ -110,6 +110,27 @@ class Kaa(KotoneBot):
110
110
  logger.exception('Failed to save error report:')
111
111
  return ''
112
112
 
113
+ @override
114
+ def _on_init_context(self) -> None:
115
+ """
116
+ 初始化 Context,从配置中读取 target_screenshot_interval。
117
+ """
118
+ from kotonebot.config.manager import load_config
119
+ from kotonebot.backend.context import init_context
120
+
121
+ # 加载配置以获取 target_screenshot_interval
122
+ config = load_config(self.config_path, type=self.config_type)
123
+ user_config = config.user_configs[0] # HACK: 硬编码
124
+ target_screenshot_interval = user_config.backend.target_screenshot_interval
125
+
126
+ d = self._on_create_device()
127
+ init_context(
128
+ config_path=self.config_path,
129
+ config_type=self.config_type,
130
+ target_device=d,
131
+ target_screenshot_interval=target_screenshot_interval
132
+ )
133
+
113
134
  @override
114
135
  def _on_after_init_context(self):
115
136
  if self.backend_instance is None:
kotonebot/kaa/metadata.py CHANGED
@@ -1,6 +1,33 @@
1
1
  WHATS_NEW = """
2
2
  # 更新日志
3
3
  ## kaa
4
+ ### v2025.7.7.0
5
+ 脚本:
6
+ * [修复] 修复 AP 商店购买时点击坐标偏移问题(#b8b56bb)
7
+ * [修复] 修复商店购买时无法识别部分偶像碎片的问题(#353fa3f)
8
+ * [修复] 修复 DMM 版购买时无法进入 AP 商店的问题(#f5a4e50)
9
+ * [修复] 修复商店购买有几率卡在确认购买对话框上(#cf1605d)
10
+ * [修复] 修复某些情况下无法自动关闭领取活动费后的弹窗(#3b3aac6)
11
+ * [新增] 金币商店可选使用每日刷新次数(#68dbc48)
12
+
13
+ 界面:
14
+ * [新增] UI 支持向局域网开放(#9b37bcf)
15
+
16
+ 框架:
17
+ * [新增] 新增目标截图间隔功能(#c8fbf80)
18
+
19
+ 其他:
20
+ * [其他] 删除一些无用 Sprite 资源(#03aa2b5)
21
+
22
+ ### v2025.7.5.0
23
+ 脚本:
24
+ * [修复] 修复有几率无法识别到进行中培育的问题(#50d1403)
25
+ * [修复] 修复分辨率缩放导致无法识别到菜单按钮(#f2eadad)
26
+ * [修复] 修复分辨率缩放时无法检测到工作完成状态的问题(#d9077e7)
27
+
28
+ 框架:
29
+ * [重构] 移除 Device.pinned 方法(#5306f5c)
30
+
4
31
  ### v2025.7.3.0
5
32
  启动器:
6
33
  * [新增] 新启动器现在支持安装指定版本与指定补丁(#456019b)
Binary file
Binary file