ksaa 2025.8.2.0__py3-none-any.whl → 2025.8.23.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. kotonebot/backend/loop.py +276 -276
  2. kotonebot/kaa/application/core/idle_mode.py +172 -0
  3. kotonebot/kaa/config/__init__.py +2 -0
  4. kotonebot/kaa/config/schema.py +11 -0
  5. kotonebot/kaa/main/gr.py +68 -25
  6. kotonebot/kaa/metadata.py +23 -0
  7. kotonebot/kaa/resources/__pycache__/__init__.cpython-310.pyc +0 -0
  8. kotonebot/kaa/resources/game.db +0 -0
  9. kotonebot/kaa/resources/game_ver.txt +0 -0
  10. kotonebot/kaa/resources/idol_cards/i_card-skin-fktn-3-013_0.png +0 -0
  11. kotonebot/kaa/resources/idol_cards/i_card-skin-fktn-3-013_1.png +0 -0
  12. kotonebot/kaa/resources/idol_cards/i_card-skin-hmsz-3-002_0.png +0 -0
  13. kotonebot/kaa/resources/idol_cards/i_card-skin-hmsz-3-002_1.png +0 -0
  14. kotonebot/kaa/resources/idol_cards/i_card-skin-jsna-3-008_0.png +0 -0
  15. kotonebot/kaa/resources/idol_cards/i_card-skin-jsna-3-008_1.png +0 -0
  16. kotonebot/kaa/sprites/70898bf8-56c5-4f84-becb-629c9ab6a7da.png +0 -0
  17. kotonebot/kaa/sprites/9fd0753f-c607-4d49-82d1-40bda27e014f.png +0 -0
  18. kotonebot/kaa/sprites/a48324ae-7c1a-489e-b3c4-93d12267f88d.png +0 -0
  19. kotonebot/kaa/sprites/ce20a856-5629-4f8e-a8e1-d1bd14e18e4f.png +0 -0
  20. kotonebot/kaa/tasks/R.py +131 -127
  21. kotonebot/kaa/tasks/daily/purchase.py +10 -5
  22. kotonebot/kaa/tasks/produce/in_purodyuusu.py +3 -3
  23. kotonebot/kaa/tasks/produce/produce.py +3 -3
  24. {ksaa-2025.8.2.0.dist-info → ksaa-2025.8.23.0.dist-info}/METADATA +89 -89
  25. {ksaa-2025.8.2.0.dist-info → ksaa-2025.8.23.0.dist-info}/RECORD +155 -146
  26. /kotonebot/kaa/sprites/{6b2bd35a-d399-4486-b4ef-24abb3e6669f.png → 00707545-6ed3-4c3a-9c84-89cb75ac1adc.png} +0 -0
  27. /kotonebot/kaa/sprites/{d2bce7a9-8709-4042-a31a-1f07b2711637.png → 03985ce5-781f-4c1b-8d49-c5f97010d5ff.png} +0 -0
  28. /kotonebot/kaa/sprites/{77c9d69b-1078-477f-897f-c50bc5013fd5.png → 04622143-7f9e-47a8-86a5-be2b81d13cb6.png} +0 -0
  29. /kotonebot/kaa/sprites/{ee191a7a-ed3e-46e2-a07a-2ca7d566d0f6.png → 04b33e1f-a341-46d4-a54b-a05f1e765c10.png} +0 -0
  30. /kotonebot/kaa/sprites/{c2841576-352b-41de-95d8-3f2640504c9c.png → 06df0c16-bb7e-41b7-90fe-afc14379b90f.png} +0 -0
  31. /kotonebot/kaa/sprites/{1ec343a7-f6d4-4ab5-967b-66f900438977.png → 08f593a9-d9eb-41ee-b2c0-010562e7ef10.png} +0 -0
  32. /kotonebot/kaa/sprites/{cde81597-2e0a-4795-910a-6e475d7cc073.png → 0bd59a8f-6fbd-4c92-8c1e-1d58716b6d84.png} +0 -0
  33. /kotonebot/kaa/sprites/{66cc412b-a4a1-4b42-89b4-7653eef41204.png → 0e332904-cace-4d02-9575-100a359c548f.png} +0 -0
  34. /kotonebot/kaa/sprites/{2d59f524-840a-445f-b432-c97051eb7043.png → 1262d83a-8f2a-4f75-b70a-385a04d35ae1.png} +0 -0
  35. /kotonebot/kaa/sprites/{8fb0f6d1-388b-41b3-964b-5965c58605c7.png → 12f47930-f691-4a3e-8c83-e47f63fb1f2b.png} +0 -0
  36. /kotonebot/kaa/sprites/{7c6dd46a-62ff-4d2c-b04a-df97ba55ed74.png → 146c742a-0fb3-4d88-851e-ddd621533ad3.png} +0 -0
  37. /kotonebot/kaa/sprites/{b144b5df-c3b5-4bda-bb3d-9c8fa1182080.png → 1a06449d-472e-4c06-9dc1-1cb06b1b1ce5.png} +0 -0
  38. /kotonebot/kaa/sprites/{9fa1e59d-36cb-43c9-a788-ed95ae93f3d0.png → 1b60b852-dc93-48a1-8b73-0d728d04e057.png} +0 -0
  39. /kotonebot/kaa/sprites/{6770f2b1-1619-4937-bf8d-284b90a5d3c6.png → 1dd337ca-20f1-4dc6-8254-235d7ec74158.png} +0 -0
  40. /kotonebot/kaa/sprites/{2b225eb3-c1b2-415a-99de-1a41a0ed4470.png → 1e17f7b1-4f64-474c-aade-4b3de32c0de4.png} +0 -0
  41. /kotonebot/kaa/sprites/{785837db-1da3-46d0-866f-017c232547ad.png → 2227a4ac-a933-4165-b594-2720a26f9e44.png} +0 -0
  42. /kotonebot/kaa/sprites/{58f1212f-a307-4179-a55c-8449e237cb3d.png → 229366ae-dbcd-4378-84a2-8a7eb1d1e084.png} +0 -0
  43. /kotonebot/kaa/sprites/{ddb5b885-93de-49d1-8150-3235d702c1c8.png → 25ceaa36-a432-4bf3-80b7-11c94cd82357.png} +0 -0
  44. /kotonebot/kaa/sprites/{72ea8e77-8773-47bf-9c5f-bf51812065cd.png → 276239b5-e41b-4ae5-9be6-37d251292d39.png} +0 -0
  45. /kotonebot/kaa/sprites/{5da76978-7dc4-4d4e-8e4c-e3189e2c2b07.png → 288a0541-a175-47b4-b75c-2e845e27cba6.png} +0 -0
  46. /kotonebot/kaa/sprites/{9552c822-a654-46a8-acd9-0320a4b6118b.png → 29449202-a6cc-4080-bb87-816481ec9506.png} +0 -0
  47. /kotonebot/kaa/sprites/{d7c2d507-640e-4705-92d0-d2e3951cc29b.png → 2ee5d498-1370-4f09-b187-41dbe582f498.png} +0 -0
  48. /kotonebot/kaa/sprites/{74d02db5-a02d-43d0-ae7a-5aeba90249be.png → 2fa084f5-0637-4d53-ada8-9c542d597a51.png} +0 -0
  49. /kotonebot/kaa/sprites/{9169b74f-7458-4562-bc90-41efe0edfc22.png → 2fc0a912-8d9b-48a3-b942-a25274c83edd.png} +0 -0
  50. /kotonebot/kaa/sprites/{c2d305cc-8fb4-4f34-a9b3-96862837a36b.png → 30ce2e03-e9b3-4b4f-aded-51a05bfca91f.png} +0 -0
  51. /kotonebot/kaa/sprites/{9cf406dc-bd69-4919-a396-d7e267b01645.png → 359d6d34-ea55-470b-b682-6c9252953e8d.png} +0 -0
  52. /kotonebot/kaa/sprites/{8cd02d5b-96f7-4b59-8676-ca07a63a7693.png → 35f613e8-61af-41b0-a397-44ae7566a233.png} +0 -0
  53. /kotonebot/kaa/sprites/{a9c016ed-463b-4e06-88ce-020c2b4dd981.png → 36039a1a-52e6-428d-9866-0f0f65a7298f.png} +0 -0
  54. /kotonebot/kaa/sprites/{203dfb12-640e-4437-9040-47045c9b8cbd.png → 3675c4aa-a208-47d1-bbcb-48bce40e6ae9.png} +0 -0
  55. /kotonebot/kaa/sprites/{e97c5043-a73e-4979-a529-34b4daaee88d.png → 3746df74-fe63-442c-85d2-8a3696cb2fcd.png} +0 -0
  56. /kotonebot/kaa/sprites/{d3a1c862-8f02-4aca-8b58-bbd337ab48bf.png → 382cb218-9e58-406f-9a3b-a9d990fc0fff.png} +0 -0
  57. /kotonebot/kaa/sprites/{88e9493c-0914-489a-9d99-addff4f0efd0.png → 3997a0e3-0826-4b1e-b7e9-4a36ebaaa9e8.png} +0 -0
  58. /kotonebot/kaa/sprites/{4a395a76-b1b6-4541-97b0-2e2603d47360.png → 3a41fe06-7f33-4c21-9edd-291191e3c563.png} +0 -0
  59. /kotonebot/kaa/sprites/{2a317f0e-613e-48c4-9def-d18a3b834254.png → 40fc17b0-718c-432d-b784-92a22c2f7512.png} +0 -0
  60. /kotonebot/kaa/sprites/{d400ab2d-b4dc-43bb-bb77-f49c666bf4b1.png → 45abba60-06d7-4921-b2a2-9ce790c2b25b.png} +0 -0
  61. /kotonebot/kaa/sprites/{9dc6ec60-597c-4305-b251-2e3342603446.png → 47d9fac4-2caf-4479-a97a-e519ddbfb3cf.png} +0 -0
  62. /kotonebot/kaa/sprites/{c85ba9aa-9ff1-42a4-b80a-ef39ab009e85.png → 4d0f75f5-632b-4c59-88a5-058622a4c3af.png} +0 -0
  63. /kotonebot/kaa/sprites/{d6182579-dc5d-4db9-a8be-0a7f3998abde.png → 4f2fcec7-399e-4184-b1dc-eabae92d63dd.png} +0 -0
  64. /kotonebot/kaa/sprites/{343d630f-375f-496a-98c5-75a1e0aa2c2c.png → 4fd7d95e-7955-4a70-ad91-67a230c647a3.png} +0 -0
  65. /kotonebot/kaa/sprites/{fbea0ab6-3094-438e-807d-5a24d0d32cf3.png → 54e29f7f-c951-46a2-a068-6911dfcf1966.png} +0 -0
  66. /kotonebot/kaa/sprites/{b28eac50-4517-4fc3-8fd9-a6a7f8d19ba5.png → 5528a0a0-2f1e-41f8-b55f-a565a2f80908.png} +0 -0
  67. /kotonebot/kaa/sprites/{1564ee9a-c2eb-4284-b22a-dd8df7c8a32f.png → 57cee3e6-eee4-4023-85f3-52959fa372a0.png} +0 -0
  68. /kotonebot/kaa/sprites/{5bf54b6d-d2b6-4211-b3f4-0713b84dd315.png → 5b2e7826-0e1c-4fd8-965c-6a3498c59825.png} +0 -0
  69. /kotonebot/kaa/sprites/{727c2d86-0daf-47d3-8eb4-500e648abfd6.png → 5cd3481b-2388-4461-b525-c2f78050822f.png} +0 -0
  70. /kotonebot/kaa/sprites/{d1b23182-244c-4e94-ac46-894b3117d1bb.png → 5fb7c821-63b4-4ee2-b6ea-16eec3a77251.png} +0 -0
  71. /kotonebot/kaa/sprites/{5c2e3a85-838c-41d5-b55e-b62fc1b95a1e.png → 5fb96a83-7b37-435b-9d7e-9caf0bc022e4.png} +0 -0
  72. /kotonebot/kaa/sprites/{92d4209d-5053-4284-a9f5-63372c8cd05b.png → 62676c2c-814a-4d8b-9bb2-232c3b434287.png} +0 -0
  73. /kotonebot/kaa/sprites/{248f9401-c340-474f-baed-1a523f441f3e.png → 651b2464-0c4a-4f3d-9452-5a40897b39e1.png} +0 -0
  74. /kotonebot/kaa/sprites/{9713c534-6f51-45c7-a03c-1acb642c519c.png → 658eb246-1469-4a86-b7a7-5e66b3102084.png} +0 -0
  75. /kotonebot/kaa/sprites/{1193a4e3-4d0d-4433-97ce-b19aeb6846c5.png → 65dbaa8c-2053-4441-9c31-8fd8fc8c87d8.png} +0 -0
  76. /kotonebot/kaa/sprites/{8fc97425-3b86-42cd-820d-2ad6321508f3.png → 67da7040-7183-4d30-89a7-e78345f42948.png} +0 -0
  77. /kotonebot/kaa/sprites/{74423820-b24e-4dd1-b6c4-7ef3d6aa3b8c.png → 6a272201-1311-41ee-b296-0a8d812d8173.png} +0 -0
  78. /kotonebot/kaa/sprites/{a9e90b22-4415-44cf-bf2f-6acb2733312f.png → 6a59aafc-4962-490e-8ab1-9ad59d22db3d.png} +0 -0
  79. /kotonebot/kaa/sprites/{52e0b7fe-271f-4713-b1b3-b06a286630d7.png → 6aa1fbb0-3880-49e1-ade3-29f627d0e38b.png} +0 -0
  80. /kotonebot/kaa/sprites/{ab39be69-bf52-4250-8e38-25b04d1e6a87.png → 6bb37f56-bac2-4852-82b0-e9b65ce0cbe8.png} +0 -0
  81. /kotonebot/kaa/sprites/{de804900-3470-478e-a51f-e3919b301326.png → 6d58dbfa-84e2-4a84-8c7c-133e459e9b40.png} +0 -0
  82. /kotonebot/kaa/sprites/{50ca8582-8787-45ff-a6b6-e1f0e8b44cb5.png → 71e84fb3-9474-4bbc-8543-ffba5758dcc0.png} +0 -0
  83. /kotonebot/kaa/sprites/{01e8e85e-056c-4428-9cb2-4024c4e6d022.png → 72a9238a-de6d-4665-85d4-265180d00db2.png} +0 -0
  84. /kotonebot/kaa/sprites/{891d4f63-df7f-462c-8908-ff4380c91b8b.png → 7533e4fd-e411-4386-a0fb-aa8f2cbeb216.png} +0 -0
  85. /kotonebot/kaa/sprites/{c673c1f3-2ac5-4fef-a9a2-203e67e1fd10.png → 77b0a64c-1e14-41d6-94af-8824982f2119.png} +0 -0
  86. /kotonebot/kaa/sprites/{b1c80e35-8949-4425-8b96-1df803cacde5.png → 78e27204-2544-419d-b66e-e9e7244f4460.png} +0 -0
  87. /kotonebot/kaa/sprites/{5b94cf27-4aa0-4de1-a9f2-ba8f5ca790fd.png → 791e885e-6e27-498f-81ff-87a40582507d.png} +0 -0
  88. /kotonebot/kaa/sprites/{327733fe-e68a-4f96-9e42-2b16629cbf8a.png → 795961a5-78c5-4ac4-a250-b1879cd2f60d.png} +0 -0
  89. /kotonebot/kaa/sprites/{190c0a4a-24c2-4717-8a78-ffa7bb0366d2.png → 7a54f094-bc75-48d3-8253-cca80a7052a2.png} +0 -0
  90. /kotonebot/kaa/sprites/{065cbac0-e09a-4bec-aa10-5fdb41720d31.png → 7b8541a8-9e82-410b-b053-3ebc96b36604.png} +0 -0
  91. /kotonebot/kaa/sprites/{9acad6e8-8380-47c9-bac8-3144c9b7b765.png → 7eff6c59-a7ed-43d5-8b67-083127e9e748.png} +0 -0
  92. /kotonebot/kaa/sprites/{644a3f8a-6b32-4c3e-9701-acb426502f81.png → 7ff80aa1-94c3-417e-9fae-3c2f2b8036a8.png} +0 -0
  93. /kotonebot/kaa/sprites/{b7bd78a1-aa4a-4847-8e9a-969989ef3cb3.png → 80ae6f18-cc26-4b31-9202-b5a0656b23ce.png} +0 -0
  94. /kotonebot/kaa/sprites/{876ec159-fc25-4c97-9c37-e3ffaba7618b.png → 80fac9c6-e6de-4fb5-9543-77797ffcde7a.png} +0 -0
  95. /kotonebot/kaa/sprites/{ddc4b13a-4a0f-46fd-8fcb-01100058f78a.png → 833ce8cb-01cd-4457-94b9-ff3f93d33f05.png} +0 -0
  96. /kotonebot/kaa/sprites/{df11deb8-940d-45a3-89b7-48c814735448.png → 8a62a66d-4b66-42d5-b004-b56eb7c45d68.png} +0 -0
  97. /kotonebot/kaa/sprites/{c75bba52-b3a5-4565-bb45-104ebed9e3d2.png → 8b3cfcfc-fa00-4bc5-9ea4-b350f2c08cb0.png} +0 -0
  98. /kotonebot/kaa/sprites/{fe9a7ad5-4506-4dfe-80a5-6f4bb9703f9c.png → 8bad2dbc-9f3a-443f-a3ff-048e70577a97.png} +0 -0
  99. /kotonebot/kaa/sprites/{96b9b3cb-7131-46ba-a193-f46446f72194.png → 8bdcc43b-876d-451f-b300-67c16c6f5c9f.png} +0 -0
  100. /kotonebot/kaa/sprites/{9f8332c7-95b4-41ec-8e7f-f5ece0a545e1.png → 8c9c9195-4eed-407c-b1ab-bb616c7b2acc.png} +0 -0
  101. /kotonebot/kaa/sprites/{180b211b-3b77-43a9-b550-6624f1b1beb1.png → 94165d54-2c09-427f-9cb1-e23fa9b06a96.png} +0 -0
  102. /kotonebot/kaa/sprites/{5ac654b1-f891-46b4-a4b2-3b8f9a60a02b.png → 98deb79d-e32b-4551-bc26-c4722d2b1307.png} +0 -0
  103. /kotonebot/kaa/sprites/{5f1e618b-a1fc-41c6-9b05-f2a76c38feb5.png → 9a816f64-b16e-4e8a-b4d8-d056c31c85f1.png} +0 -0
  104. /kotonebot/kaa/sprites/{39ab37d4-2654-4102-ba75-17d6bbd79673.png → 9b0f6620-5fd0-4393-ae67-555baf171550.png} +0 -0
  105. /kotonebot/kaa/sprites/{3fa41725-c619-4ed8-811c-c6f0e9366126.png → 9d9dd078-9bb3-4f5f-9ef5-63c203bf02c9.png} +0 -0
  106. /kotonebot/kaa/sprites/{43c175e2-7e7e-405a-8c92-0cf3d7400d12.png → 9e5afe22-f817-45f7-b0dd-2c808adff8cb.png} +0 -0
  107. /kotonebot/kaa/sprites/{cd1f5c42-582e-408e-bb9f-08f7b868d9fc.png → 9f41a6b4-2955-4105-8610-423f267807de.png} +0 -0
  108. /kotonebot/kaa/sprites/{969ddfa4-c0c8-41c8-b51b-40febf152c7a.png → 9fb0f700-1eaf-4677-bd1f-05f9f311cdfc.png} +0 -0
  109. /kotonebot/kaa/sprites/{133ea490-fefe-4785-b531-3cc7072338da.png → a04c4402-e071-401a-9549-d573eabc0e59.png} +0 -0
  110. /kotonebot/kaa/sprites/{ab823208-66f4-4a97-836b-024bf27b7c74.png → a18a08f5-c752-4fa4-a451-b48f5ca11360.png} +0 -0
  111. /kotonebot/kaa/sprites/{19060076-f971-411c-9b1b-f22e18871b74.png → a1bae28b-7b90-4009-b384-79f7a8974078.png} +0 -0
  112. /kotonebot/kaa/sprites/{aec4ecf4-c1d7-424f-8acc-388ff286a360.png → a4935638-882c-4d3f-af77-e5888ad0b71e.png} +0 -0
  113. /kotonebot/kaa/sprites/{6006a923-8f9b-4dfc-aa81-1e4672db6908.png → a898c01d-1347-484f-b2b0-10858a1ef3a6.png} +0 -0
  114. /kotonebot/kaa/sprites/{3ac2cb20-6563-4505-85bc-1fd3b93902a3.png → a921b8d5-93b7-4346-9ae4-d2e1def1ec1a.png} +0 -0
  115. /kotonebot/kaa/sprites/{356f4aa8-ebc5-4edc-9724-badf6d02d61e.png → a975a75e-e774-481b-8ade-9b1229bc95dd.png} +0 -0
  116. /kotonebot/kaa/sprites/{a5a16fb6-5513-4e17-b871-968425bfdf81.png → ad455e8e-fb2f-4180-af29-7ef66c98daa9.png} +0 -0
  117. /kotonebot/kaa/sprites/{cfd353f0-073f-462e-928b-3cda9344eec4.png → ae1a5e05-d53d-43aa-9f27-b9117483d19e.png} +0 -0
  118. /kotonebot/kaa/sprites/{f2b30fe6-1a32-4f0f-98c1-478e90db1f1b.png → aeff3068-5f5c-4685-a328-fe367d426c46.png} +0 -0
  119. /kotonebot/kaa/sprites/{0300702d-1023-4af7-9fee-54c058f7f1a8.png → b5a883c1-8086-4c60-a789-a7819c674645.png} +0 -0
  120. /kotonebot/kaa/sprites/{9acf0817-ab1f-45e1-a26f-99c3c331a184.png → b5ecb8e2-8b1a-4240-a2c9-152ccecdacbe.png} +0 -0
  121. /kotonebot/kaa/sprites/{58cbe76f-7cab-490d-8668-1076e76d9e9f.png → b6cda449-d5ab-4a38-9c85-c25e1b73f588.png} +0 -0
  122. /kotonebot/kaa/sprites/{9ce465b3-b4a6-4646-a559-3088621a1da1.png → b9e687ca-ba44-4aa1-a282-b7da6cffb2ba.png} +0 -0
  123. /kotonebot/kaa/sprites/{9a3c04af-7ba4-4520-a666-3045c1b3385c.png → bc393fa9-317c-48f9-88cf-cd4d93af1569.png} +0 -0
  124. /kotonebot/kaa/sprites/{ab52b70e-ca1f-47fe-aff8-0bfae7eeb8ff.png → bdc3b84b-18a4-4abe-938d-3e6495bef7eb.png} +0 -0
  125. /kotonebot/kaa/sprites/{c447f3cf-05b3-413d-9a50-f09a22b17e8d.png → bfa4b6bf-c032-46b8-9ce3-268717e4e364.png} +0 -0
  126. /kotonebot/kaa/sprites/{ed84a435-c52c-4294-ad80-bf3c63e2878d.png → c1504a57-77f0-46ca-a30b-162120489d5c.png} +0 -0
  127. /kotonebot/kaa/sprites/{1935d9dc-84ff-47a8-a65b-a458a224b4cc.png → c3d5a935-6e77-4751-a0b1-b1ac3a3edf0a.png} +0 -0
  128. /kotonebot/kaa/sprites/{44d9cfe6-742c-46de-8f53-4f49babfabcc.png → c86250ac-bde0-45bb-b696-f8b94e2d2d3b.png} +0 -0
  129. /kotonebot/kaa/sprites/{55e853dd-07bc-4086-8a2d-60d24ff75839.png → c89ce004-a437-4b94-9420-0d9bf2ed7e25.png} +0 -0
  130. /kotonebot/kaa/sprites/{c14e3dd6-ffca-4011-b24d-da330162804d.png → ca680286-0937-46e1-8b4d-ee900baed756.png} +0 -0
  131. /kotonebot/kaa/sprites/{9d61082b-7e07-4da2-9210-5744a2481da4.png → ccb8054c-345d-43c9-8b2c-7b2243ad6668.png} +0 -0
  132. /kotonebot/kaa/sprites/{57c8fe6f-e970-4364-9359-9c273ca37b85.png → ccbbecec-5cf5-4f9f-8358-6b3408689234.png} +0 -0
  133. /kotonebot/kaa/sprites/{bde3bbca-be39-494f-944a-f73582cd5f97.png → cd8d48f2-77d2-4d0b-a81f-53a1549457e9.png} +0 -0
  134. /kotonebot/kaa/sprites/{76e3c1b4-cd2f-47f1-96bf-9b86a84aa24c.png → ceb4fae9-b5e5-41cf-856b-bcf753f477d9.png} +0 -0
  135. /kotonebot/kaa/sprites/{0450fdf0-f03d-4efc-b047-27532571c620.png → cf615078-aedf-46af-a94d-9328a16fbc13.png} +0 -0
  136. /kotonebot/kaa/sprites/{b7ee5425-c4ec-4030-9343-1737628b1936.png → cf8b2ae3-f948-4204-b7da-c0801f1368f4.png} +0 -0
  137. /kotonebot/kaa/sprites/{929d1dc7-6f9e-444b-9b57-ab8baacfe524.png → db86f5a5-0272-4a74-893e-077acbbecf23.png} +0 -0
  138. /kotonebot/kaa/sprites/{9cc5a374-ca08-4fa9-a2b7-e1f65871962d.png → dfe926f6-a3b3-48c2-9ebd-757f77d932a6.png} +0 -0
  139. /kotonebot/kaa/sprites/{63a3a9ca-aff2-428a-8df2-9a0ed4e398c6.png → e2a98bd2-56d1-47e9-806a-a36d06bd3f16.png} +0 -0
  140. /kotonebot/kaa/sprites/{22394de7-f95b-4001-a961-d854c34f1d8c.png → ecc2500b-4916-4c47-a840-98233d53522b.png} +0 -0
  141. /kotonebot/kaa/sprites/{70a0da32-7fe7-41a9-9fc1-265764a0b125.png → ed081194-272d-461a-93a1-ec476a896753.png} +0 -0
  142. /kotonebot/kaa/sprites/{1c0c3381-4d9b-4279-ac89-784b9e9d7e63.png → ef21cbe1-7263-4a68-ad8c-b9aac503978a.png} +0 -0
  143. /kotonebot/kaa/sprites/{c44a35b8-4254-4f4f-99a8-18a3195ae696.png → f0370809-4383-4039-b8ec-f80a9216a7b3.png} +0 -0
  144. /kotonebot/kaa/sprites/{39a5eb7d-0ece-4eca-bf0e-4bf2f8faf1e2.png → f47d8096-63bf-42ed-8f4f-5f6f1d8772f4.png} +0 -0
  145. /kotonebot/kaa/sprites/{14cd7285-f587-49af-9960-802c41050201.png → f60a8a24-b358-4f3a-af2c-4e4a31c5d36e.png} +0 -0
  146. /kotonebot/kaa/sprites/{b6da32be-5c6d-40a8-b1d0-15e0576c6f71.png → fa1eea22-b329-4c1c-8446-279c542f6da0.png} +0 -0
  147. /kotonebot/kaa/sprites/{d9b23b65-6780-446b-950c-48ca668f838a.png → fa72809a-d057-40a0-b771-f4d96bc1ced2.png} +0 -0
  148. /kotonebot/kaa/sprites/{73c270f5-055a-4cc3-9036-c95321faec4a.png → fb870576-1837-4267-bc0f-e0685bf7a136.png} +0 -0
  149. /kotonebot/kaa/sprites/{d76bed23-33cf-4f86-bb01-add1185098a1.png → fc7b1cdb-d0d0-4470-b5fd-218a8551dc9f.png} +0 -0
  150. /kotonebot/kaa/sprites/{ef8b7148-cc8f-4a76-a981-68062909e5a9.png → fcbeb870-6853-4e2c-8a6e-54b4787e3a2e.png} +0 -0
  151. /kotonebot/kaa/sprites/{c0adda90-8b05-4a6b-b091-9d2c9d4b84f8.png → fd354169-e32a-45be-9a1e-da0136b91dc3.png} +0 -0
  152. {ksaa-2025.8.2.0.dist-info → ksaa-2025.8.23.0.dist-info}/WHEEL +0 -0
  153. {ksaa-2025.8.2.0.dist-info → ksaa-2025.8.23.0.dist-info}/entry_points.txt +0 -0
  154. {ksaa-2025.8.2.0.dist-info → ksaa-2025.8.23.0.dist-info}/licenses/LICENSE +0 -0
  155. {ksaa-2025.8.2.0.dist-info → ksaa-2025.8.23.0.dist-info}/top_level.txt +0 -0
kotonebot/backend/loop.py CHANGED
@@ -1,277 +1,277 @@
1
- import time
2
- from functools import lru_cache, partial
3
- from typing import Callable, Any, overload, Literal, Generic, TypeVar, cast, get_args, get_origin
4
-
5
- from cv2.typing import MatLike
6
-
7
- from kotonebot.util import Interval
8
- from kotonebot import device, image, ocr
9
- from kotonebot.backend.core import Image
10
- from kotonebot.backend.ocr import TextComparator
11
- from kotonebot.client.protocol import ClickableObjectProtocol
12
-
13
-
14
- class LoopAction:
15
- def __init__(self, loop: 'Loop', func: Callable[[], ClickableObjectProtocol | None]):
16
- self.loop = loop
17
- self.func = func
18
- self.result: ClickableObjectProtocol | None = None
19
-
20
- @property
21
- def found(self):
22
- """
23
- 是否找到结果。若父 Loop 未在运行中,则返回 False。
24
- """
25
- if not self.loop.running:
26
- return False
27
- return bool(self.result)
28
-
29
- def __bool__(self):
30
- return self.found
31
-
32
- def reset(self):
33
- """
34
- 重置 LoopAction,以复用此对象。
35
- """
36
- self.result = None
37
-
38
- def do(self):
39
- """
40
- 执行 LoopAction。
41
- :return: 执行结果。
42
- """
43
- if not self.loop.running:
44
- return
45
- if self.loop.found_anything:
46
- # 本轮循环已执行任意操作,因此不需要再继续检测
47
- return
48
- self.result = self.func()
49
- if self.result:
50
- self.loop.found_anything = True
51
-
52
- def click(self, *, at: tuple[int, int] | None = None):
53
- """
54
- 点击寻找结果。若结果为空,会跳过执行。
55
-
56
- :return:
57
- """
58
- if self.result:
59
- if at is not None:
60
- device.click(*at)
61
- else:
62
- device.click(self.result)
63
-
64
- def call(self, func: Callable[[ClickableObjectProtocol], Any]):
65
- pass
66
-
67
-
68
- class Loop:
69
- def __init__(
70
- self,
71
- *,
72
- timeout: float = 300,
73
- interval: float = 0.3,
74
- auto_screenshot: bool = True
75
- ):
76
- self.running = True
77
- self.found_anything = False
78
- self.auto_screenshot = auto_screenshot
79
- """
80
- 是否在每次循环开始时(Loop.tick() 被调用时)截图。
81
- """
82
- self.__last_loop: float = -1
83
- self.__interval = Interval(interval)
84
- self.screenshot: MatLike | None = None
85
- """上次截图时的图像数据。"""
86
-
87
- def __iter__(self):
88
- self.__interval.reset()
89
- return self
90
-
91
- def __next__(self):
92
- if not self.running:
93
- raise StopIteration
94
- self.found_anything = False
95
- self.__last_loop = time.time()
96
- return self.tick()
97
-
98
- def tick(self):
99
- self.__interval.wait()
100
- if self.auto_screenshot:
101
- self.screenshot = device.screenshot()
102
- self.__last_loop = time.time()
103
- self.found_anything = False
104
- return self
105
-
106
- def exit(self):
107
- """
108
- 结束循环。
109
- """
110
- self.running = False
111
-
112
- @overload
113
- def when(self, condition: Image) -> LoopAction:
114
- ...
115
-
116
- @overload
117
- def when(self, condition: TextComparator) -> LoopAction:
118
- ...
119
-
120
- def when(self, condition: Any):
121
- """
122
- 判断某个条件是否成立。
123
-
124
- :param condition:
125
- :return:
126
- """
127
- if isinstance(condition, Image):
128
- func = partial(image.find, condition)
129
- elif isinstance(condition, TextComparator):
130
- func = partial(ocr.find, condition)
131
- else:
132
- raise ValueError('Invalid condition type.')
133
- la = LoopAction(self, func)
134
- la.reset()
135
- la.do()
136
- return la
137
-
138
- def until(self, condition: Any):
139
- """
140
- 当满足指定条件时,结束循环。
141
-
142
- 等价于 ``loop.when(...).call(lambda _: loop.exit())``
143
- """
144
- return self.when(condition).call(lambda _: self.exit())
145
-
146
- def click_if(self, condition: Any, *, at: tuple[int, int] | None = None):
147
- """
148
- 检测指定对象是否出现,若出现,点击该对象或指定位置。
149
-
150
- ``click_if()`` 等价于 ``loop.when(...).click(...)``。
151
-
152
- :param condition: 检测目标。
153
- :param at: 点击位置。若为 None,表示点击找到的目标。
154
- """
155
- return self.when(condition).click(at=at)
156
-
157
- StateType = TypeVar('StateType')
158
- class StatedLoop(Loop, Generic[StateType]):
159
- def __init__(
160
- self,
161
- states: list[Any] | None = None,
162
- initial_state: StateType | None = None,
163
- *,
164
- timeout: float = 300,
165
- interval: float = 0.3,
166
- auto_screenshot: bool = True
167
- ):
168
- self.__tmp_states = states
169
- self.__tmp_initial_state = initial_state
170
- self.state: StateType
171
- super().__init__(timeout=timeout, interval=interval, auto_screenshot=auto_screenshot)
172
-
173
- def __iter__(self):
174
- # __retrive_state_values() 只能在非 __init__ 中调用
175
- self.__retrive_state_values()
176
- return super().__iter__()
177
-
178
- def __retrive_state_values(self):
179
- # HACK: __orig_class__ 是 undocumented 属性
180
- if not hasattr(self, '__orig_class__'):
181
- # 如果 Foo 不是以参数化泛型的方式实例化的,可能没有 __orig_class__
182
- if self.state is None:
183
- raise ValueError('Either specify `states` or use StatedLoop[Literal[...]] syntax.')
184
- else:
185
- generic_type_args = get_args(self.__orig_class__) # type: ignore
186
- if len(generic_type_args) != 1:
187
- raise ValueError('StatedLoop must have exactly one generic type argument.')
188
- state_values = get_args(generic_type_args[0])
189
- if not state_values:
190
- raise ValueError('StatedLoop must have at least one state value.')
191
- self.states = cast(tuple[StateType, ...], state_values)
192
- self.state = self.__tmp_initial_state or self.states[0]
193
- return state_values
194
-
195
-
196
- def StatedLoop2(states: StateType) -> StatedLoop[StateType]:
197
- state_values = get_args(states)
198
- return cast(StatedLoop[StateType], Loop())
199
-
200
- if __name__ == '__main__':
201
- from kotonebot.kaa.tasks import R
202
- from kotonebot.backend.ocr import contains
203
- from kotonebot.backend.context import manual_context, init_context
204
-
205
- # T = TypeVar('T')
206
- # class Foo(Generic[T]):
207
- # def get_literal_params(self) -> list | None:
208
- # """
209
- # 尝试获取泛型参数 T (如果它是 Literal 类型) 的参数列表。
210
- # """
211
- # # self.__orig_class__ 会是 Foo 的具体参数化类型,
212
- # # 例如 Foo[Literal['p0', 'p1', 'p2', 'p3', 'ap']]
213
- # if not hasattr(self, '__orig_class__'):
214
- # # 如果 Foo 不是以参数化泛型的方式实例化的,可能没有 __orig_class__
215
- # return None
216
- #
217
- # # generic_type_args 是传递给 Foo 的类型参数元组
218
- # # 例如 (Literal['p0', 'p1', 'p2', 'p3', 'ap'],)
219
- # generic_type_args = get_args(self.__orig_class__)
220
- #
221
- # if not generic_type_args:
222
- # # Foo 没有类型参数
223
- # return None
224
- #
225
- # # T_type 是 Foo 的第一个类型参数
226
- # # 例如 Literal['p0', 'p1', 'p2', 'p3', 'ap']
227
- # t_type = generic_type_args[0]
228
- #
229
- # # 检查 T_type 是否是 Literal 类型
230
- # if get_origin(t_type) is Literal:
231
- # # literal_args 是 Literal 类型的参数元组
232
- # # 例如 ('p0', 'p1', 'p2', 'p3', 'ap')
233
- # literal_args = get_args(t_type)
234
- # return list(literal_args)
235
- # else:
236
- # # T 不是 Literal 类型
237
- # return None
238
- # f = Foo[Literal['p0', 'p1', 'p2', 'p3', 'ap']]()
239
- # values = f.get_literal_params()
240
- # 1
241
-
242
- from typing_extensions import reveal_type
243
- slp = StatedLoop[Literal['p0', 'p1', 'p2', 'p3', 'ap']]()
244
- for l in slp:
245
- reveal_type(l.states)
246
-
247
- # init_context()
248
- # manual_context().begin()
249
- # for l in Loop():
250
- # l.when(R.Produce.ButtonUse).click()
251
- # l.when(R.Produce.ButtonRefillAP).click()
252
- # l.when(contains("123")).click()
253
- # l.click_if(contains("!23"), at=(1, 2))
254
-
255
- # State = Literal['p0', 'p1', 'p2', 'p3', 'ap']
256
- # for sl in StatedLoop[State]():
257
- # match sl.state:
258
- # case 'p0':
259
- # sl.click_if(R.Produce.ButtonProduce)
260
- # sl.click_if(contains('master'))
261
- # sl.when(R.Produce.ButtonPIdolOverview).goto('p1')
262
- # # AP 不足
263
- # sl.when(R.Produce.TextAPInsufficient).goto('ap')
264
- # case 'ap':
265
- # pass
266
- # # p1: 选择偶像
267
- # case 'p1':
268
- # sl.call(lambda _: select_idol(idol_skin_id), once=True)
269
- # sl.when(R.Produce.TextAnotherIdolAvailableDialog).call(dialog.no)
270
- # sl.click_if(R.Common.ButtonNextNoIcon)
271
- # sl.until(R.Produce.TextStepIndicator2).goto('p2')
272
- # case 'p2':
273
- # sl.when(contains("123")).click()
274
- # case 'p3':
275
- # sl.click_if(contains("!23"), at=(1, 2))
276
- # case _:
1
+ import time
2
+ from functools import lru_cache, partial
3
+ from typing import Callable, Any, overload, Literal, Generic, TypeVar, cast, get_args, get_origin
4
+
5
+ from cv2.typing import MatLike
6
+
7
+ from kotonebot.util import Interval
8
+ from kotonebot import device, image, ocr
9
+ from kotonebot.backend.core import Image
10
+ from kotonebot.backend.ocr import TextComparator
11
+ from kotonebot.client.protocol import ClickableObjectProtocol
12
+
13
+
14
+ class LoopAction:
15
+ def __init__(self, loop: 'Loop', func: Callable[[], ClickableObjectProtocol | None]):
16
+ self.loop = loop
17
+ self.func = func
18
+ self.result: ClickableObjectProtocol | None = None
19
+
20
+ @property
21
+ def found(self):
22
+ """
23
+ 是否找到结果。若父 Loop 未在运行中,则返回 False。
24
+ """
25
+ if not self.loop.running:
26
+ return False
27
+ return bool(self.result)
28
+
29
+ def __bool__(self):
30
+ return self.found
31
+
32
+ def reset(self):
33
+ """
34
+ 重置 LoopAction,以复用此对象。
35
+ """
36
+ self.result = None
37
+
38
+ def do(self):
39
+ """
40
+ 执行 LoopAction。
41
+ :return: 执行结果。
42
+ """
43
+ if not self.loop.running:
44
+ return
45
+ if self.loop.found_anything:
46
+ # 本轮循环已执行任意操作,因此不需要再继续检测
47
+ return
48
+ self.result = self.func()
49
+ if self.result:
50
+ self.loop.found_anything = True
51
+
52
+ def click(self, *, at: tuple[int, int] | None = None):
53
+ """
54
+ 点击寻找结果。若结果为空,会跳过执行。
55
+
56
+ :return:
57
+ """
58
+ if self.result:
59
+ if at is not None:
60
+ device.click(*at)
61
+ else:
62
+ device.click(self.result)
63
+
64
+ def call(self, func: Callable[[ClickableObjectProtocol], Any]):
65
+ pass
66
+
67
+
68
+ class Loop:
69
+ def __init__(
70
+ self,
71
+ *,
72
+ timeout: float = 300,
73
+ interval: float = 0.3,
74
+ auto_screenshot: bool = True
75
+ ):
76
+ self.running = True
77
+ self.found_anything = False
78
+ self.auto_screenshot = auto_screenshot
79
+ """
80
+ 是否在每次循环开始时(Loop.tick() 被调用时)截图。
81
+ """
82
+ self.__last_loop: float = -1
83
+ self.__interval = Interval(interval)
84
+ self.screenshot: MatLike | None = None
85
+ """上次截图时的图像数据。"""
86
+
87
+ def __iter__(self):
88
+ self.__interval.reset()
89
+ return self
90
+
91
+ def __next__(self):
92
+ if not self.running:
93
+ raise StopIteration
94
+ self.found_anything = False
95
+ self.__last_loop = time.time()
96
+ return self.tick()
97
+
98
+ def tick(self):
99
+ self.__interval.wait()
100
+ if self.auto_screenshot:
101
+ self.screenshot = device.screenshot()
102
+ self.__last_loop = time.time()
103
+ self.found_anything = False
104
+ return self
105
+
106
+ def exit(self):
107
+ """
108
+ 结束循环。
109
+ """
110
+ self.running = False
111
+
112
+ @overload
113
+ def when(self, condition: Image) -> LoopAction:
114
+ ...
115
+
116
+ @overload
117
+ def when(self, condition: TextComparator) -> LoopAction:
118
+ ...
119
+
120
+ def when(self, condition: Any):
121
+ """
122
+ 判断某个条件是否成立。
123
+
124
+ :param condition:
125
+ :return:
126
+ """
127
+ if isinstance(condition, Image):
128
+ func = partial(image.find, condition)
129
+ elif isinstance(condition, TextComparator):
130
+ func = partial(ocr.find, condition)
131
+ else:
132
+ raise ValueError('Invalid condition type.')
133
+ la = LoopAction(self, func)
134
+ la.reset()
135
+ la.do()
136
+ return la
137
+
138
+ def until(self, condition: Any):
139
+ """
140
+ 当满足指定条件时,结束循环。
141
+
142
+ 等价于 ``loop.when(...).call(lambda _: loop.exit())``
143
+ """
144
+ return self.when(condition).call(lambda _: self.exit())
145
+
146
+ def click_if(self, condition: Any, *, at: tuple[int, int] | None = None):
147
+ """
148
+ 检测指定对象是否出现,若出现,点击该对象或指定位置。
149
+
150
+ ``click_if()`` 等价于 ``loop.when(...).click(...)``。
151
+
152
+ :param condition: 检测目标。
153
+ :param at: 点击位置。若为 None,表示点击找到的目标。
154
+ """
155
+ return self.when(condition).click(at=at)
156
+
157
+ StateType = TypeVar('StateType')
158
+ class StatedLoop(Loop, Generic[StateType]):
159
+ def __init__(
160
+ self,
161
+ states: list[Any] | None = None,
162
+ initial_state: StateType | None = None,
163
+ *,
164
+ timeout: float = 300,
165
+ interval: float = 0.3,
166
+ auto_screenshot: bool = True
167
+ ):
168
+ self.__tmp_states = states
169
+ self.__tmp_initial_state = initial_state
170
+ self.state: StateType
171
+ super().__init__(timeout=timeout, interval=interval, auto_screenshot=auto_screenshot)
172
+
173
+ def __iter__(self):
174
+ # __retrive_state_values() 只能在非 __init__ 中调用
175
+ self.__retrive_state_values()
176
+ return super().__iter__()
177
+
178
+ def __retrive_state_values(self):
179
+ # HACK: __orig_class__ 是 undocumented 属性
180
+ if not hasattr(self, '__orig_class__'):
181
+ # 如果 Foo 不是以参数化泛型的方式实例化的,可能没有 __orig_class__
182
+ if self.state is None:
183
+ raise ValueError('Either specify `states` or use StatedLoop[Literal[...]] syntax.')
184
+ else:
185
+ generic_type_args = get_args(self.__orig_class__) # type: ignore
186
+ if len(generic_type_args) != 1:
187
+ raise ValueError('StatedLoop must have exactly one generic type argument.')
188
+ state_values = get_args(generic_type_args[0])
189
+ if not state_values:
190
+ raise ValueError('StatedLoop must have at least one state value.')
191
+ self.states = cast(tuple[StateType, ...], state_values)
192
+ self.state = self.__tmp_initial_state or self.states[0]
193
+ return state_values
194
+
195
+
196
+ def StatedLoop2(states: StateType) -> StatedLoop[StateType]:
197
+ state_values = get_args(states)
198
+ return cast(StatedLoop[StateType], Loop())
199
+
200
+ if __name__ == '__main__':
201
+ from kotonebot.kaa.tasks import R
202
+ from kotonebot.backend.ocr import contains
203
+ from kotonebot.backend.context import manual_context, init_context
204
+
205
+ # T = TypeVar('T')
206
+ # class Foo(Generic[T]):
207
+ # def get_literal_params(self) -> list | None:
208
+ # """
209
+ # 尝试获取泛型参数 T (如果它是 Literal 类型) 的参数列表。
210
+ # """
211
+ # # self.__orig_class__ 会是 Foo 的具体参数化类型,
212
+ # # 例如 Foo[Literal['p0', 'p1', 'p2', 'p3', 'ap']]
213
+ # if not hasattr(self, '__orig_class__'):
214
+ # # 如果 Foo 不是以参数化泛型的方式实例化的,可能没有 __orig_class__
215
+ # return None
216
+ #
217
+ # # generic_type_args 是传递给 Foo 的类型参数元组
218
+ # # 例如 (Literal['p0', 'p1', 'p2', 'p3', 'ap'],)
219
+ # generic_type_args = get_args(self.__orig_class__)
220
+ #
221
+ # if not generic_type_args:
222
+ # # Foo 没有类型参数
223
+ # return None
224
+ #
225
+ # # T_type 是 Foo 的第一个类型参数
226
+ # # 例如 Literal['p0', 'p1', 'p2', 'p3', 'ap']
227
+ # t_type = generic_type_args[0]
228
+ #
229
+ # # 检查 T_type 是否是 Literal 类型
230
+ # if get_origin(t_type) is Literal:
231
+ # # literal_args 是 Literal 类型的参数元组
232
+ # # 例如 ('p0', 'p1', 'p2', 'p3', 'ap')
233
+ # literal_args = get_args(t_type)
234
+ # return list(literal_args)
235
+ # else:
236
+ # # T 不是 Literal 类型
237
+ # return None
238
+ # f = Foo[Literal['p0', 'p1', 'p2', 'p3', 'ap']]()
239
+ # values = f.get_literal_params()
240
+ # 1
241
+
242
+ from typing_extensions import reveal_type
243
+ slp = StatedLoop[Literal['p0', 'p1', 'p2', 'p3', 'ap']]()
244
+ for l in slp:
245
+ reveal_type(l.states)
246
+
247
+ # init_context()
248
+ # manual_context().begin()
249
+ # for l in Loop():
250
+ # l.when(R.Produce.ButtonUse).click()
251
+ # l.when(R.Produce.ButtonRefillAP).click()
252
+ # l.when(contains("123")).click()
253
+ # l.click_if(contains("!23"), at=(1, 2))
254
+
255
+ # State = Literal['p0', 'p1', 'p2', 'p3', 'ap']
256
+ # for sl in StatedLoop[State]():
257
+ # match sl.state:
258
+ # case 'p0':
259
+ # sl.click_if(R.Produce.ButtonProduce)
260
+ # sl.click_if(contains('master'))
261
+ # sl.when(R.Produce.ButtonPIdolOverview).goto('p1')
262
+ # # AP 不足
263
+ # sl.when(R.Produce.TextAPInsufficient).goto('ap')
264
+ # case 'ap':
265
+ # pass
266
+ # # p1: 选择偶像
267
+ # case 'p1':
268
+ # sl.call(lambda _: select_idol(idol_skin_id), once=True)
269
+ # sl.when(R.Produce.TextAnotherIdolAvailableDialog).call(dialog.no)
270
+ # sl.click_if(R.Common.ButtonNextNoIcon)
271
+ # sl.until(R.Produce.TextStepIndicator2).goto('p2')
272
+ # case 'p2':
273
+ # sl.when(contains("123")).click()
274
+ # case 'p3':
275
+ # sl.click_if(contains("!23"), at=(1, 2))
276
+ # case _:
277
277
  # assert_never(sl.state)