ksaa 2025.7.7.0__py3-none-any.whl → 2025.7.13.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 (170) hide show
  1. kotonebot/backend/context/context.py +23 -10
  2. kotonebot/errors.py +5 -1
  3. kotonebot/kaa/common.py +2 -976
  4. kotonebot/kaa/config/__init__.py +62 -0
  5. kotonebot/kaa/config/const.py +255 -0
  6. kotonebot/kaa/config/migrations/__init__.py +28 -0
  7. kotonebot/kaa/config/migrations/_idol.py +106 -0
  8. kotonebot/kaa/config/migrations/_v1_to_v2.py +203 -0
  9. kotonebot/kaa/config/migrations/_v2_to_v3.py +126 -0
  10. kotonebot/kaa/config/migrations/_v3_to_v4.py +29 -0
  11. kotonebot/kaa/config/migrations/_v4_to_v5.py +26 -0
  12. kotonebot/kaa/config/migrations/_v5_to_v6.py +134 -0
  13. kotonebot/kaa/config/produce.py +255 -0
  14. kotonebot/kaa/config/schema.py +236 -0
  15. kotonebot/kaa/config/upgrade.py +63 -0
  16. kotonebot/kaa/game_ui/commu_event_buttons.py +3 -0
  17. kotonebot/kaa/game_ui/schedule.py +1 -1
  18. kotonebot/kaa/main/gr.py +821 -172
  19. kotonebot/kaa/main/kaa.py +23 -13
  20. kotonebot/kaa/metadata.py +45 -0
  21. kotonebot/kaa/resources/__pycache__/__init__.cpython-310.pyc +0 -0
  22. kotonebot/kaa/tasks/R.py +126 -126
  23. kotonebot/kaa/tasks/daily/acquire_activity_funds.py +1 -1
  24. kotonebot/kaa/tasks/daily/acquire_presents.py +1 -1
  25. kotonebot/kaa/tasks/daily/assignment.py +1 -1
  26. kotonebot/kaa/tasks/daily/capsule_toys.py +1 -1
  27. kotonebot/kaa/tasks/daily/club_reward.py +1 -1
  28. kotonebot/kaa/tasks/daily/contest.py +1 -1
  29. kotonebot/kaa/tasks/daily/mission_reward.py +1 -1
  30. kotonebot/kaa/tasks/daily/purchase.py +1 -1
  31. kotonebot/kaa/tasks/daily/upgrade_support_card.py +1 -1
  32. kotonebot/kaa/tasks/end_game.py +1 -1
  33. kotonebot/kaa/tasks/produce/cards.py +1 -1
  34. kotonebot/kaa/tasks/produce/common.py +3 -2
  35. kotonebot/kaa/tasks/produce/in_purodyuusu.py +9 -7
  36. kotonebot/kaa/tasks/produce/non_lesson_actions.py +3 -2
  37. kotonebot/kaa/tasks/produce/produce.py +27 -22
  38. kotonebot/kaa/tasks/start_game.py +1 -1
  39. {ksaa-2025.7.7.0.dist-info → ksaa-2025.7.13.0.dist-info}/METADATA +1 -1
  40. {ksaa-2025.7.7.0.dist-info → ksaa-2025.7.13.0.dist-info}/RECORD +170 -158
  41. /kotonebot/kaa/sprites/{2f4f3d81-2a8c-49d3-84a8-4d1205237ed4.png → 065de266-800e-4ebf-bab1-a37038e531d8.png} +0 -0
  42. /kotonebot/kaa/sprites/{177ee196-1013-487e-9944-64c4a9b803ef.png → 0951b840-439e-4289-991e-51b5b2df0bb2.png} +0 -0
  43. /kotonebot/kaa/sprites/{6d4337f4-e30c-44eb-bab9-220a46c0c96f.png → 09ca39cd-c964-4258-a860-6a327e31713c.png} +0 -0
  44. /kotonebot/kaa/sprites/{9e861b2e-f896-4738-b0d0-9b703395720d.png → 0b166ce2-85b0-4207-b4ee-e720462cf9ab.png} +0 -0
  45. /kotonebot/kaa/sprites/{1cd922b1-cd9c-4b60-b7e7-014c59217cb0.png → 0d10fa02-b8e7-405a-a463-83f472807a39.png} +0 -0
  46. /kotonebot/kaa/sprites/{c692a9b3-8a2a-42f1-8f63-ad8bd553272d.png → 0edc4c9d-9249-4bf0-86ad-c9fee3ee06f7.png} +0 -0
  47. /kotonebot/kaa/sprites/{f5917c99-185e-4bd9-b367-972c77accb44.png → 10d7c07d-9731-4b2a-bc92-bfb822616303.png} +0 -0
  48. /kotonebot/kaa/sprites/{59997849-5a5a-4589-a4ff-e91a789fc68d.png → 13ebdaaf-dee5-48be-963e-c2e6915b2b00.png} +0 -0
  49. /kotonebot/kaa/sprites/{b720a22b-a2f1-4686-969d-2a2edd8fb96b.png → 14e920fb-7410-4927-96e1-c40211069182.png} +0 -0
  50. /kotonebot/kaa/sprites/{489feedd-f44e-4714-ad24-b53630dfcf27.png → 17d9408b-b429-402c-9d06-f2a0b2b1abe2.png} +0 -0
  51. /kotonebot/kaa/sprites/{835a1f3e-5a06-4490-bc2e-c6d3d8edc1fd.png → 2228a02e-fec3-4bb7-ad29-d7ef0d7b7a90.png} +0 -0
  52. /kotonebot/kaa/sprites/{9d94c24c-5aab-4fb6-8fa7-902cebac134c.png → 28b29b73-758c-41ef-8829-4b93d7a6f424.png} +0 -0
  53. /kotonebot/kaa/sprites/{e64c9477-35f7-4f05-995f-f3f38bb7db66.png → 2b845193-37f8-4e17-9fd2-52765977b1fa.png} +0 -0
  54. /kotonebot/kaa/sprites/{21fe29c2-f49b-473f-8ac3-896b4d3c72f5.png → 31f239cb-58f7-4fe9-95e4-15572afa9855.png} +0 -0
  55. /kotonebot/kaa/sprites/{466524da-0d9e-424f-82eb-d6e6d3145bd3.png → 32fa7671-2413-400f-9bad-3fd7859840e4.png} +0 -0
  56. /kotonebot/kaa/sprites/{80c45554-0758-47eb-b9d7-d8c10f462ae5.png → 33dfe24e-9cc8-43c9-98a8-999e850b778a.png} +0 -0
  57. /kotonebot/kaa/sprites/{84c0f8bf-c670-47d4-8d5c-06de599f7c40.png → 34050b3d-1684-403d-95b1-8ad7ff2a85bb.png} +0 -0
  58. /kotonebot/kaa/sprites/{30ff50f2-7ab2-4a1d-88db-fd6deaba328e.png → 387b6503-d6c8-40ab-8cad-2a81021b6103.png} +0 -0
  59. /kotonebot/kaa/sprites/{1d714b45-6b20-40ba-8e0b-e7c106f0c8f3.png → 3995bbdb-4b0c-4327-b299-7d105a78e977.png} +0 -0
  60. /kotonebot/kaa/sprites/{4112f697-094b-4046-bfac-409f156784b0.png → 43648de0-a0dc-4d0b-b081-ddb4a6aae9c4.png} +0 -0
  61. /kotonebot/kaa/sprites/{899ad2c0-7b23-4b77-aed4-34ba4911672b.png → 44713a59-3d15-427a-af43-27efdc1b2b20.png} +0 -0
  62. /kotonebot/kaa/sprites/{4670fd78-3748-4df3-968b-25c8246da92b.png → 46189b9d-16fd-4385-9654-2a6fa95bc933.png} +0 -0
  63. /kotonebot/kaa/sprites/{f9e8cde8-fda0-4436-8072-6bc32c3c0b8e.png → 4660a922-bb9a-4543-b11a-d7b3be41e42e.png} +0 -0
  64. /kotonebot/kaa/sprites/{b2f31f86-b7ae-4eb1-8042-d14c5b226714.png → 476c4b40-a024-4253-bd57-b775b1559c44.png} +0 -0
  65. /kotonebot/kaa/sprites/{c639b2f6-35f2-4924-9e81-878637c176a6.png → 488c8e34-9a36-4335-8a69-c9288e3344d7.png} +0 -0
  66. /kotonebot/kaa/sprites/{f18c683d-1eb2-4279-a05c-c411683354df.png → 48a169b5-e3ad-41c8-9895-5fff217a24a3.png} +0 -0
  67. /kotonebot/kaa/sprites/{bfd495eb-7ec2-47d7-aff2-59c1a663be5d.png → 48d52db5-9d6f-4d6d-a8a9-56ec3e03cf2e.png} +0 -0
  68. /kotonebot/kaa/sprites/{d07f0d30-465e-4b4e-803f-a81aeabdd1e8.png → 4ca16d51-1b1c-4174-98df-dce028749eb0.png} +0 -0
  69. /kotonebot/kaa/sprites/{54f5e4d6-44f9-4249-bf80-aaaacf0a8d52.png → 4ee4dde9-378f-4ef3-b1f3-29bbb3d9e073.png} +0 -0
  70. /kotonebot/kaa/sprites/{025f1786-cd28-4a08-ad81-178d267dbb1a.png → 4f36ddbb-967e-41d5-9bdb-05bb8f906227.png} +0 -0
  71. /kotonebot/kaa/sprites/{b73fa422-bf9c-43aa-ad80-ae92286042e6.png → 51c39af7-efe6-4763-a85c-f1275e7cf4e8.png} +0 -0
  72. /kotonebot/kaa/sprites/{31dd40b0-1c07-4d6c-aabe-fd3e4895f4df.png → 524134df-5ade-4eb0-903f-dbae8d2a6e00.png} +0 -0
  73. /kotonebot/kaa/sprites/{d7d6ace9-35f1-4c71-b4c1-9de938b254f4.png → 582e8afb-81d9-433b-9297-2741f78224c0.png} +0 -0
  74. /kotonebot/kaa/sprites/{e6a16a1e-e821-45f0-bc64-f2e0dab7efd7.png → 59d453f1-a2df-4138-9e4e-277f6b636bde.png} +0 -0
  75. /kotonebot/kaa/sprites/{2ffd9c12-0520-4f9c-92b1-bfdef0681583.png → 5b382fe1-da9d-4644-b4e7-aa2759b36b9d.png} +0 -0
  76. /kotonebot/kaa/sprites/{97e33fa0-1442-418d-b393-3b916312c9e1.png → 5ca735d9-04b0-40a4-8eda-adbf9d0ded34.png} +0 -0
  77. /kotonebot/kaa/sprites/{af0f65a5-8d32-4211-86df-66b3fa609462.png → 5cda82c5-6026-4a4b-9447-30779ef07e51.png} +0 -0
  78. /kotonebot/kaa/sprites/{7315c6b9-6fda-4790-8e9a-c8c4220834e1.png → 5e00a181-041a-4456-8850-773f68de8573.png} +0 -0
  79. /kotonebot/kaa/sprites/{0089161a-0dac-41da-97af-b9200339a383.png → 6151e500-a626-44db-89d5-a7b15d99f9aa.png} +0 -0
  80. /kotonebot/kaa/sprites/{898325da-307d-4108-ab4c-25d9ae94ee24.png → 618b8738-c9ae-4def-951f-a3627b26a980.png} +0 -0
  81. /kotonebot/kaa/sprites/{a586f586-85e9-439e-ab3f-905d6cbe6746.png → 661760df-f790-47cb-8ddf-21b684a1096d.png} +0 -0
  82. /kotonebot/kaa/sprites/{5200fbda-653d-4b6f-84d8-15793cc53684.png → 69601752-7606-4af4-9252-097be36eec84.png} +0 -0
  83. /kotonebot/kaa/sprites/{2d0ed04f-777a-4a69-9a58-0be791260dca.png → 69d32f6c-e982-4418-94f9-5a625dc06584.png} +0 -0
  84. /kotonebot/kaa/sprites/{f2d614b3-d3bf-4340-b261-f4c385a59e4e.png → 6c2ba024-4e1e-4a07-9b58-277a1873c279.png} +0 -0
  85. /kotonebot/kaa/sprites/{c9e507d5-94dd-4ff3-b995-70c6cb360095.png → 6cc3d385-7c1a-4df2-92dd-0bc7f4931f2c.png} +0 -0
  86. /kotonebot/kaa/sprites/{b2743383-a3e4-43ff-82a3-3c7c6450fc50.png → 6d7d40e7-8f54-40b5-a900-784e2ced0df5.png} +0 -0
  87. /kotonebot/kaa/sprites/{06e7d3f6-1ab8-4714-8ab5-8af71dcbfa78.png → 721caff2-926b-4778-a20b-77c9fee8f45a.png} +0 -0
  88. /kotonebot/kaa/sprites/{dfb1d18d-b768-46c4-9d31-b654ba7a2b6d.png → 740c5975-00d7-42a7-ad95-cee0d59db3f0.png} +0 -0
  89. /kotonebot/kaa/sprites/{3de5ce1b-f72b-450a-a1de-5a841fbd507a.png → 75972e14-44b8-4ac7-9bfa-a0e0ed563b05.png} +0 -0
  90. /kotonebot/kaa/sprites/{2146a037-c3ad-4c33-834c-ddd7f3b7876c.png → 77a55e26-3901-4be0-9edb-a434c6e5e719.png} +0 -0
  91. /kotonebot/kaa/sprites/{0a3c0a4e-a979-401c-9bf3-a389e8a74e7b.png → 79d26ab2-499d-46a5-b15d-a0d0845fc535.png} +0 -0
  92. /kotonebot/kaa/sprites/{78c0f6b4-c09d-4b44-9b5e-35e1e40dd748.png → 7a72a3ad-666c-478e-a249-2ca7e35f84cb.png} +0 -0
  93. /kotonebot/kaa/sprites/{f9b38a5e-72cb-4b18-8817-18473effd41d.png → 7b58df80-77e7-4a81-84b5-3d7e61f4237e.png} +0 -0
  94. /kotonebot/kaa/sprites/{b974e1ac-1f24-4498-aa84-62cb5c0984e7.png → 80ca25c8-03b6-4ed8-bf0b-36f6ad71ffd4.png} +0 -0
  95. /kotonebot/kaa/sprites/{1cede0b7-5042-481c-b507-957dd98ec17a.png → 83d759a1-04fc-40d3-93d6-d31b4be70e5d.png} +0 -0
  96. /kotonebot/kaa/sprites/{20748b0c-889f-4706-857b-48fc921a88e3.png → 84b25f6f-aeb4-41b0-bb61-9e028ee1173f.png} +0 -0
  97. /kotonebot/kaa/sprites/{6490c5b2-2ed8-44d6-93b8-72d88434b49e.png → 88bcca49-4150-4820-8b47-049f7f1aa604.png} +0 -0
  98. /kotonebot/kaa/sprites/{5367d7ad-5a27-42e4-a7d9-5bf27102f502.png → 88cb2321-ac35-4fe6-a467-19ba5ef3af35.png} +0 -0
  99. /kotonebot/kaa/sprites/{e798ff2f-6f30-4536-923a-a65433817423.png → 897a1e29-c5e2-4c26-a348-6fd7d63c9f09.png} +0 -0
  100. /kotonebot/kaa/sprites/{cdc6e5e2-5b38-4471-b23f-17ec229268db.png → 8a8f4be3-9538-4ead-9002-009432dce534.png} +0 -0
  101. /kotonebot/kaa/sprites/{fc44214e-ef8a-4ea1-baec-35674ce0c4d6.png → 8acb588c-200f-4927-bb50-2f01c7fbf0f5.png} +0 -0
  102. /kotonebot/kaa/sprites/{0913f34e-1790-4afb-af31-9a5e94d54b05.png → 8d093e5a-3ce8-4e67-9e5d-7d91f2dd3b00.png} +0 -0
  103. /kotonebot/kaa/sprites/{3091351b-ab63-4688-8082-32545052d7a8.png → 8e0b582b-68d3-4a4f-93e1-dec23e8e6abf.png} +0 -0
  104. /kotonebot/kaa/sprites/{1762b8dc-abb8-402e-88b9-22111b054d27.png → 8f1413b8-fe01-4a37-9c10-0dcabf092367.png} +0 -0
  105. /kotonebot/kaa/sprites/{688d653e-7ee7-4d41-ac79-b4efd6c3cadd.png → 917cd398-166e-4abe-a769-6d74cfbb611e.png} +0 -0
  106. /kotonebot/kaa/sprites/{adf0eea7-a052-410b-b479-8c672ae38268.png → 92ac2224-ce9d-4ba0-aafc-c627ba97c163.png} +0 -0
  107. /kotonebot/kaa/sprites/{6f06519d-4f33-4418-b4cb-35a7356cc121.png → 9529c488-2256-4a3d-baed-4928c151b1b1.png} +0 -0
  108. /kotonebot/kaa/sprites/{18369504-36b1-4b10-93e6-878c2cae6c8f.png → 9579ad74-b049-4e27-a07c-12537c5ee051.png} +0 -0
  109. /kotonebot/kaa/sprites/{99b58811-42ff-415b-9229-f5c75cbe1a1a.png → 96044a90-a417-4042-a359-ddfd374afd0c.png} +0 -0
  110. /kotonebot/kaa/sprites/{0eb4e53c-f0af-4c86-870c-b1db087d53db.png → 96669532-4774-4c2e-bda0-ea94f3b1d41b.png} +0 -0
  111. /kotonebot/kaa/sprites/{c7e90767-3661-4e86-8c54-8e1d1e83d113.png → 985e8bd4-7658-4da1-beb3-c53220ec1c25.png} +0 -0
  112. /kotonebot/kaa/sprites/{1e398be7-49ac-4eb6-b828-b935f042037a.png → 995b71e0-ce5d-48b7-b1a1-35443a37c295.png} +0 -0
  113. /kotonebot/kaa/sprites/{467fe027-96ba-48b1-963b-75a5c41277c4.png → 9e5202cc-ef3c-433e-8cbb-afa5842f0a34.png} +0 -0
  114. /kotonebot/kaa/sprites/{6faf9942-994d-418a-ae42-25c5fcffa79e.png → 9fd3858a-c2a7-468d-b224-ca6386a08d1e.png} +0 -0
  115. /kotonebot/kaa/sprites/{2712893d-0219-43e1-8de7-c2761456719e.png → 9ff3e793-1c21-45c6-88b5-24543f300f81.png} +0 -0
  116. /kotonebot/kaa/sprites/{4abd8e80-83ef-4d1a-b143-e6ad0ac189ab.png → a49babfb-a958-4de0-b2c5-2c64ce8641fa.png} +0 -0
  117. /kotonebot/kaa/sprites/{126f5161-3567-4c76-8e91-371392e39a9c.png → a5b80b05-f6a2-407e-bf93-27b88bd982d1.png} +0 -0
  118. /kotonebot/kaa/sprites/{05d933de-6274-4d46-a81b-860de1981ebc.png → a622194f-000b-48d9-871f-89e2ba9a249d.png} +0 -0
  119. /kotonebot/kaa/sprites/{7dd1c478-719f-4432-891f-9543064fd1fc.png → a7b99e72-68c1-4b11-994f-a3238bee5fa3.png} +0 -0
  120. /kotonebot/kaa/sprites/{87a59b06-0ac7-4a35-93c4-3705bf9e774a.png → a9ec257b-d82f-4ebf-9b46-1af8836d5768.png} +0 -0
  121. /kotonebot/kaa/sprites/{08f93e03-18c9-42e3-9a2f-7d7954f585b0.png → abeb625a-74c1-45dc-a6c9-2a123dee1ab4.png} +0 -0
  122. /kotonebot/kaa/sprites/{2ed453f3-9c31-4c96-95dd-1a6aa68302f7.png → af04e2ac-bffa-4bfb-9580-c934e403d578.png} +0 -0
  123. /kotonebot/kaa/sprites/{f3e4e9ec-ddd6-42c4-9638-b93ff4e6b514.png → b04f4554-d6ea-4f99-822c-657ad1b9cd1e.png} +0 -0
  124. /kotonebot/kaa/sprites/{d5899bda-b311-469d-b4fb-963799ef1720.png → b06ebc30-305e-4f8a-8a3c-1d91aab4f9c0.png} +0 -0
  125. /kotonebot/kaa/sprites/{bbfb7670-2537-4a92-9a39-487d174f27a0.png → b07b112c-08c8-45ff-b980-105d263ff1c4.png} +0 -0
  126. /kotonebot/kaa/sprites/{4d3e267c-552c-4a65-840a-dc72a61c8db1.png → b1e6c930-f659-4ea8-a694-a4590160b438.png} +0 -0
  127. /kotonebot/kaa/sprites/{e6d0979a-cd27-4933-b528-7777be525ace.png → b34c399b-ea60-4de2-86ee-003d308594c2.png} +0 -0
  128. /kotonebot/kaa/sprites/{d43f214a-4db4-4222-941c-3d3216a0c0c3.png → b4db5745-d7d0-4afb-8962-9f71fc4188c8.png} +0 -0
  129. /kotonebot/kaa/sprites/{4eb9a3a1-da46-493b-a17d-5eb9ef53524c.png → ba45d490-da2e-4c2f-badf-7058f1802ad3.png} +0 -0
  130. /kotonebot/kaa/sprites/{3e9bdd08-3a74-40b3-8320-05ed4e8fe5d7.png → c03c6076-7935-42e7-a2e5-5f74015e92e2.png} +0 -0
  131. /kotonebot/kaa/sprites/{5cff1e6f-81ea-4d4a-88ba-209cf3bbb165.png → c0b5a0a7-0cb7-4d2c-8105-42b434437610.png} +0 -0
  132. /kotonebot/kaa/sprites/{23464a7b-dc7a-439c-86b7-04a5dd506412.png → c2a12970-cfff-4772-a4ec-127f4309f2b5.png} +0 -0
  133. /kotonebot/kaa/sprites/{c1336997-ea27-4d53-9c64-826ca7eca11f.png → c9f0ddc4-832c-42f0-b46d-a2b4326d1a1c.png} +0 -0
  134. /kotonebot/kaa/sprites/{3ddd0976-7c8b-4c67-bac7-a0cc1af3bfad.png → ca37b366-0a29-436c-8c22-78daf4148bfe.png} +0 -0
  135. /kotonebot/kaa/sprites/{c686d99a-248a-460b-a4fe-2fa5b8e9660b.png → cafb66c1-10d3-4612-80f9-f9e183d509c6.png} +0 -0
  136. /kotonebot/kaa/sprites/{8308964d-96d1-4b7e-b0fa-b20163311153.png → cf007582-08d0-4fc7-bc7c-113e211b226a.png} +0 -0
  137. /kotonebot/kaa/sprites/{308818b7-a252-45a6-868d-553c078b3752.png → cf33f626-5944-4dfe-bb46-2976c187f2a9.png} +0 -0
  138. /kotonebot/kaa/sprites/{f957edb2-3534-4d1d-a9be-70b478b2ff63.png → d1f662b1-7aa2-4ccc-a8bf-6e7a94ae2427.png} +0 -0
  139. /kotonebot/kaa/sprites/{6df0db09-9159-43b5-a6b9-43a2dfdafdab.png → d1fff69a-474d-416f-a53f-2a88a4d552c7.png} +0 -0
  140. /kotonebot/kaa/sprites/{e614c8e1-1d7b-4535-a8ba-cbf09fd5b163.png → d251bb28-4d34-4db9-85eb-554a56ac8184.png} +0 -0
  141. /kotonebot/kaa/sprites/{bcb990e6-58ae-460d-859a-812b4121e716.png → d2fe6a19-df40-43f9-8e75-2376e9987290.png} +0 -0
  142. /kotonebot/kaa/sprites/{2154ebd3-9c89-4355-b4f4-a5e18ecf728d.png → d7b786c8-7887-4870-a719-f703945cc6f1.png} +0 -0
  143. /kotonebot/kaa/sprites/{6f638005-aa18-4804-a5fe-269de4d1ad9e.png → d9ac597e-8d6d-4ab3-b865-e68a83563d25.png} +0 -0
  144. /kotonebot/kaa/sprites/{54d71b39-a3f2-4f20-a294-b6b5ef9c56f3.png → db041968-9811-494c-ae2c-1b31d4e1773c.png} +0 -0
  145. /kotonebot/kaa/sprites/{119f04e2-3871-46a8-9d5c-808c641f7aae.png → db2fb64d-3e2d-4cd4-ac3a-a993e9784697.png} +0 -0
  146. /kotonebot/kaa/sprites/{10713c56-e462-4543-8a51-02f220ed6943.png → dd268b19-354f-4e39-a4b4-0578719a40e1.png} +0 -0
  147. /kotonebot/kaa/sprites/{7c40ea85-87f6-4531-a25a-896dd70b49d1.png → deca8ee5-616a-4652-8a37-dab4f34951b6.png} +0 -0
  148. /kotonebot/kaa/sprites/{acd1a611-f93d-4d32-8070-dc325b42eeb9.png → e214cd8e-b79f-42e5-959a-64f745f35896.png} +0 -0
  149. /kotonebot/kaa/sprites/{dd431a8a-3ffa-43d6-96c6-4e84aa946b72.png → e2d11737-e1e2-4056-bd85-7d242c9c3023.png} +0 -0
  150. /kotonebot/kaa/sprites/{4e040068-e2ae-4348-80a2-f113c2426d46.png → e6e33419-ee43-48d1-98c6-a64f07b9e9e9.png} +0 -0
  151. /kotonebot/kaa/sprites/{e007420c-b92b-414c-96a3-d556e3c25cb2.png → e7fb4631-aad6-4fad-934c-72396737a98a.png} +0 -0
  152. /kotonebot/kaa/sprites/{bad07ebd-c8e7-4721-ab74-a38fa30e0401.png → eb56ba19-433e-4bab-9e47-7a2702c83954.png} +0 -0
  153. /kotonebot/kaa/sprites/{fffa0118-dd3a-4d01-8c4e-d43182778391.png → ebef3530-94ab-4ba7-b43e-5b3249286d51.png} +0 -0
  154. /kotonebot/kaa/sprites/{5d5db2d4-2648-40fe-bd17-05aea9afbc7d.png → edcb7ca8-9e3f-4232-b6c9-b7189a62d2ec.png} +0 -0
  155. /kotonebot/kaa/sprites/{acd01a53-c689-4ffd-ae45-744a37c70197.png → ee7c3730-b678-4ffe-a7e5-5637016ce5b4.png} +0 -0
  156. /kotonebot/kaa/sprites/{e87f0760-4bc9-4d7f-91e2-5452ba0fcd9d.png → f270ddb2-fabc-4dd6-818a-c818a44893ed.png} +0 -0
  157. /kotonebot/kaa/sprites/{f26d4e09-2511-48e4-9c69-ba413ddf65e1.png → f2b784ee-eeca-4633-9083-4cb996c26f66.png} +0 -0
  158. /kotonebot/kaa/sprites/{76f43a30-b76d-4648-91b6-49f2786e668d.png → f621f114-11c3-4957-a86c-cb474721d660.png} +0 -0
  159. /kotonebot/kaa/sprites/{5587551f-011c-4f94-86e8-7e81d08c4be2.png → f85c9e53-870d-46e4-9963-c5245d0c5628.png} +0 -0
  160. /kotonebot/kaa/sprites/{5efa51e6-5cb7-4843-9397-8d71c6175fcf.png → f88ee970-84ea-46b2-99e0-d3fe1cde908e.png} +0 -0
  161. /kotonebot/kaa/sprites/{51eac702-ca23-4aba-b75a-cdb03a93a117.png → fa8ee7e4-ee13-497e-856b-e210f6b1f114.png} +0 -0
  162. /kotonebot/kaa/sprites/{6a45398a-4240-4fb7-8926-fa1254125bbf.png → fb00d537-d921-4a5f-9bc7-8aac1b68a71d.png} +0 -0
  163. /kotonebot/kaa/sprites/{2d4001e6-137e-40b2-94b0-ba3ae9e397e4.png → fc23b108-7717-4b16-9e91-aacd5ddcc2ce.png} +0 -0
  164. /kotonebot/kaa/sprites/{d108794a-60b8-4637-bced-84f46140eaac.png → fd3b7b22-7011-4267-8365-64a4933073a4.png} +0 -0
  165. /kotonebot/kaa/sprites/{774ca489-09c2-414e-b27b-f32d3bf6894d.png → fd7ce00d-d45c-468b-a918-f5ded551a17d.png} +0 -0
  166. /kotonebot/kaa/sprites/{e93a983d-b869-45e4-8a5c-cd1c9d511b11.png → ffd7676f-6b57-42d2-9631-bc758d2e0a31.png} +0 -0
  167. {ksaa-2025.7.7.0.dist-info → ksaa-2025.7.13.0.dist-info}/WHEEL +0 -0
  168. {ksaa-2025.7.7.0.dist-info → ksaa-2025.7.13.0.dist-info}/entry_points.txt +0 -0
  169. {ksaa-2025.7.7.0.dist-info → ksaa-2025.7.13.0.dist-info}/licenses/LICENSE +0 -0
  170. {ksaa-2025.7.7.0.dist-info → ksaa-2025.7.13.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,62 @@
1
+ from .schema import (
2
+ BaseConfig,
3
+ PurchaseConfig,
4
+ ActivityFundsConfig,
5
+ PresentsConfig,
6
+ AssignmentConfig,
7
+ ContestConfig,
8
+ ProduceConfig,
9
+ MissionRewardConfig,
10
+ ClubRewardConfig,
11
+ UpgradeSupportCardConfig,
12
+ CapsuleToysConfig,
13
+ TraceConfig,
14
+ StartGameConfig,
15
+ EndGameConfig,
16
+ MiscConfig,
17
+ conf,
18
+ )
19
+ from .const import (
20
+ ConfigEnum,
21
+ Priority,
22
+ APShopItems,
23
+ DailyMoneyShopItems,
24
+ ProduceAction,
25
+ RecommendCardDetectionMode,
26
+ )
27
+
28
+ # 配置升级逻辑
29
+ from .upgrade import upgrade_config
30
+ from .migrations import MIGRATION_REGISTRY, LATEST_VERSION
31
+
32
+ __all__ = [
33
+ # schema 导出
34
+ "BaseConfig",
35
+ "PurchaseConfig",
36
+ "ActivityFundsConfig",
37
+ "PresentsConfig",
38
+ "AssignmentConfig",
39
+ "ContestConfig",
40
+ "ProduceConfig",
41
+ "MissionRewardConfig",
42
+ "ClubRewardConfig",
43
+ "UpgradeSupportCardConfig",
44
+ "CapsuleToysConfig",
45
+ "TraceConfig",
46
+ "StartGameConfig",
47
+ "EndGameConfig",
48
+ "MiscConfig",
49
+ "conf",
50
+ # const 导出
51
+ "ConfigEnum",
52
+ "Priority",
53
+ "APShopItems",
54
+ "DailyMoneyShopItems",
55
+ "ProduceAction",
56
+ "RecommendCardDetectionMode",
57
+ # upgrade 导出
58
+ "upgrade_config",
59
+ "migrations",
60
+ "MIGRATION_REGISTRY",
61
+ "LATEST_VERSION",
62
+ ]
@@ -0,0 +1,255 @@
1
+ from enum import IntEnum, Enum
2
+ from typing_extensions import assert_never
3
+
4
+
5
+ class ConfigEnum(Enum):
6
+ def display(self) -> str:
7
+ return self.value[1]
8
+
9
+
10
+ class Priority(IntEnum):
11
+ """
12
+ 任务优先级。数字越大,优先级越高,越先执行。
13
+ """
14
+ START_GAME = 1
15
+ DEFAULT = 0
16
+ CLAIM_MISSION_REWARD = -1
17
+ END_GAME = -2
18
+
19
+
20
+ class APShopItems(IntEnum):
21
+ PRODUCE_PT_UP = 0
22
+ """获取支援强化 Pt 提升"""
23
+ PRODUCE_NOTE_UP = 1
24
+ """获取笔记数提升"""
25
+ RECHALLENGE = 2
26
+ """再挑战券"""
27
+ REGENERATE_MEMORY = 3
28
+ """回忆再生成券"""
29
+
30
+
31
+ class DailyMoneyShopItems(IntEnum):
32
+ """日常商店物品"""
33
+ Recommendations = -1
34
+ """所有推荐商品"""
35
+ LessonNote = 0
36
+ """レッスンノート"""
37
+ VeteranNote = 1
38
+ """ベテランノート"""
39
+ SupportEnhancementPt = 2
40
+ """サポート強化Pt 支援强化Pt"""
41
+ SenseNoteVocal = 3
42
+ """センスノート(ボーカル)感性笔记(声乐)"""
43
+ SenseNoteDance = 4
44
+ """センスノート(ダンス)感性笔记(舞蹈)"""
45
+ SenseNoteVisual = 5
46
+ """センスノート(ビジュアル)感性笔记(形象)"""
47
+ LogicNoteVocal = 6
48
+ """ロジックノート(ボーカル)理性笔记(声乐)"""
49
+ LogicNoteDance = 7
50
+ """ロジックノート(ダンス)理性笔记(舞蹈)"""
51
+ LogicNoteVisual = 8
52
+ """ロジックノート(ビジュアル)理性笔记(形象)"""
53
+ AnomalyNoteVocal = 9
54
+ """アノマリーノート(ボーカル)非凡笔记(声乐)"""
55
+ AnomalyNoteDance = 10
56
+ """アノマリーノート(ダンス)非凡笔记(舞蹈)"""
57
+ AnomalyNoteVisual = 11
58
+ """アノマリーノート(ビジュアル)非凡笔记(形象)"""
59
+ RechallengeTicket = 12
60
+ """再挑戦チケット 重新挑战券"""
61
+ RecordKey = 13
62
+ """記録の鍵 解锁交流的物品"""
63
+
64
+ # 碎片
65
+ IdolPiece_倉本千奈_WonderScale = 14
66
+ """倉本千奈 WonderScale 碎片"""
67
+ IdolPiece_篠泽广_光景 = 15
68
+ """篠泽广 光景 碎片"""
69
+ IdolPiece_紫云清夏_TameLieOneStep = 16
70
+ """紫云清夏 Tame-Lie-One-Step 碎片"""
71
+ IdolPiece_葛城リーリヤ_白線 = 17
72
+ """葛城リーリヤ 白線 碎片"""
73
+ IdolPiece_姬崎莉波_clumsy_trick = 18
74
+ """姫崎薪波 cIclumsy trick 碎片"""
75
+ IdolPiece_花海咲季_FightingMyWay = 19
76
+ """花海咲季 FightingMyWay 碎片"""
77
+ IdolPiece_藤田ことね_世界一可愛い私 = 20
78
+ """藤田ことね 世界一可愛い私 碎片"""
79
+ IdolPiece_花海佑芽_TheRollingRiceball = 21
80
+ """花海佑芽 The Rolling Riceball 碎片"""
81
+ IdolPiece_月村手毬_LunaSayMaybe = 22
82
+ """月村手毬 Luna say maybe 碎片"""
83
+ IdolPiece_有村麻央_Fluorite = 23
84
+ """有村麻央 Fluorite 碎片"""
85
+
86
+ @classmethod
87
+ def to_ui_text(cls, item: "DailyMoneyShopItems") -> str:
88
+ """获取枚举值对应的UI显示文本"""
89
+ match item:
90
+ case cls.Recommendations:
91
+ return "所有推荐商品"
92
+ case cls.LessonNote:
93
+ return "课程笔记"
94
+ case cls.VeteranNote:
95
+ return "老手笔记"
96
+ case cls.SupportEnhancementPt:
97
+ return "支援强化点数"
98
+ case cls.SenseNoteVocal:
99
+ return "感性笔记(声乐)"
100
+ case cls.SenseNoteDance:
101
+ return "感性笔记(舞蹈)"
102
+ case cls.SenseNoteVisual:
103
+ return "感性笔记(形象)"
104
+ case cls.LogicNoteVocal:
105
+ return "理性笔记(声乐)"
106
+ case cls.LogicNoteDance:
107
+ return "理性笔记(舞蹈)"
108
+ case cls.LogicNoteVisual:
109
+ return "理性笔记(形象)"
110
+ case cls.AnomalyNoteVocal:
111
+ return "非凡笔记(声乐)"
112
+ case cls.AnomalyNoteDance:
113
+ return "非凡笔记(舞蹈)"
114
+ case cls.AnomalyNoteVisual:
115
+ return "非凡笔记(形象)"
116
+ case cls.RechallengeTicket:
117
+ return "重新挑战券"
118
+ case cls.RecordKey:
119
+ return "记录钥匙"
120
+ case cls.IdolPiece_倉本千奈_WonderScale:
121
+ return "倉本千奈 WonderScale 碎片"
122
+ case cls.IdolPiece_篠泽广_光景:
123
+ return "篠泽广 光景 碎片"
124
+ case cls.IdolPiece_紫云清夏_TameLieOneStep:
125
+ return "紫云清夏 Tame-Lie-One-Step 碎片"
126
+ case cls.IdolPiece_葛城リーリヤ_白線:
127
+ return "葛城リーリヤ 白線 碎片"
128
+ case cls.IdolPiece_姬崎莉波_clumsy_trick:
129
+ return "姫崎薪波 clumsy trick 碎片"
130
+ case cls.IdolPiece_花海咲季_FightingMyWay:
131
+ return "花海咲季 FightingMyWay 碎片"
132
+ case cls.IdolPiece_藤田ことね_世界一可愛い私:
133
+ return "藤田ことね 世界一可愛い私 碎片"
134
+ case cls.IdolPiece_花海佑芽_TheRollingRiceball:
135
+ return "花海佑芽 The Rolling Riceball 碎片"
136
+ case cls.IdolPiece_月村手毬_LunaSayMaybe:
137
+ return "月村手毬 Luna say maybe 碎片"
138
+ case cls.IdolPiece_有村麻央_Fluorite:
139
+ return "有村麻央 Fluorite 碎片"
140
+ case _:
141
+ assert_never(item)
142
+
143
+ @classmethod
144
+ def all(cls) -> list[tuple[str, 'DailyMoneyShopItems']]:
145
+ """获取所有枚举值及其对应的UI显示文本"""
146
+ return [(cls.to_ui_text(item), item) for item in cls]
147
+
148
+ @classmethod
149
+ def _is_note(cls, item: 'DailyMoneyShopItems') -> bool:
150
+ """判断是否为笔记"""
151
+ return 'Note' in item.name and not item.name.startswith('Note') and not item.name.endswith('Note')
152
+
153
+ @classmethod
154
+ def note_items(cls) -> list[tuple[str, 'DailyMoneyShopItems']]:
155
+ """获取所有枚举值及其对应的UI显示文本"""
156
+ return [(cls.to_ui_text(item), item) for item in cls if cls._is_note(item)]
157
+
158
+ def to_resource(self):
159
+ from kotonebot.kaa.tasks import R
160
+ match self:
161
+ case DailyMoneyShopItems.Recommendations:
162
+ return R.Daily.TextShopRecommended
163
+ case DailyMoneyShopItems.LessonNote:
164
+ return R.Shop.ItemLessonNote
165
+ case DailyMoneyShopItems.VeteranNote:
166
+ return R.Shop.ItemVeteranNote
167
+ case DailyMoneyShopItems.SupportEnhancementPt:
168
+ return R.Shop.ItemSupportEnhancementPt
169
+ case DailyMoneyShopItems.SenseNoteVocal:
170
+ return R.Shop.ItemSenseNoteVocal
171
+ case DailyMoneyShopItems.SenseNoteDance:
172
+ return R.Shop.ItemSenseNoteDance
173
+ case DailyMoneyShopItems.SenseNoteVisual:
174
+ return R.Shop.ItemSenseNoteVisual
175
+ case DailyMoneyShopItems.LogicNoteVocal:
176
+ return R.Shop.ItemLogicNoteVocal
177
+ case DailyMoneyShopItems.LogicNoteDance:
178
+ return R.Shop.ItemLogicNoteDance
179
+ case DailyMoneyShopItems.LogicNoteVisual:
180
+ return R.Shop.ItemLogicNoteVisual
181
+ case DailyMoneyShopItems.AnomalyNoteVocal:
182
+ return R.Shop.ItemAnomalyNoteVocal
183
+ case DailyMoneyShopItems.AnomalyNoteDance:
184
+ return R.Shop.ItemAnomalyNoteDance
185
+ case DailyMoneyShopItems.AnomalyNoteVisual:
186
+ return R.Shop.ItemAnomalyNoteVisual
187
+ case DailyMoneyShopItems.RechallengeTicket:
188
+ return R.Shop.ItemRechallengeTicket
189
+ case DailyMoneyShopItems.RecordKey:
190
+ return R.Shop.ItemRecordKey
191
+ case DailyMoneyShopItems.IdolPiece_倉本千奈_WonderScale:
192
+ return R.Shop.IdolPiece.倉本千奈_WonderScale
193
+ case DailyMoneyShopItems.IdolPiece_篠泽广_光景:
194
+ return R.Shop.IdolPiece.篠泽广_光景
195
+ case DailyMoneyShopItems.IdolPiece_紫云清夏_TameLieOneStep:
196
+ return R.Shop.IdolPiece.紫云清夏_TameLieOneStep
197
+ case DailyMoneyShopItems.IdolPiece_葛城リーリヤ_白線:
198
+ return R.Shop.IdolPiece.葛城リーリヤ_白線
199
+ case DailyMoneyShopItems.IdolPiece_姬崎莉波_clumsy_trick:
200
+ return R.Shop.IdolPiece.姬崎莉波_clumsy_trick
201
+ case DailyMoneyShopItems.IdolPiece_花海咲季_FightingMyWay:
202
+ return R.Shop.IdolPiece.花海咲季_FightingMyWay
203
+ case DailyMoneyShopItems.IdolPiece_藤田ことね_世界一可愛い私:
204
+ return R.Shop.IdolPiece.藤田ことね_世界一可愛い私
205
+ case DailyMoneyShopItems.IdolPiece_花海佑芽_TheRollingRiceball:
206
+ return R.Shop.IdolPiece.花海佑芽_TheRollingRiceball
207
+ case DailyMoneyShopItems.IdolPiece_月村手毬_LunaSayMaybe:
208
+ return R.Shop.IdolPiece.月村手毬_LunaSayMaybe
209
+ case DailyMoneyShopItems.IdolPiece_有村麻央_Fluorite:
210
+ return R.Shop.IdolPiece.有村麻央_Fluorite
211
+ case _:
212
+ assert_never(self)
213
+
214
+
215
+ class ProduceAction(Enum):
216
+ RECOMMENDED = 'recommended'
217
+ VISUAL = 'visual'
218
+ VOCAL = 'vocal'
219
+ DANCE = 'dance'
220
+ # VISUAL_SP = 'visual_sp'
221
+ # VOCAL_SP = 'vocal_sp'
222
+ # DANCE_SP = 'dance_sp'
223
+ OUTING = 'outing'
224
+ STUDY = 'study'
225
+ ALLOWANCE = 'allowance'
226
+ REST = 'rest'
227
+ CONSULT = 'consult'
228
+
229
+ @property
230
+ def display_name(self):
231
+ MAP = {
232
+ ProduceAction.RECOMMENDED: '推荐行动',
233
+ ProduceAction.VISUAL: '形象课程',
234
+ ProduceAction.VOCAL: '声乐课程',
235
+ ProduceAction.DANCE: '舞蹈课程',
236
+ ProduceAction.OUTING: '外出(おでかけ)',
237
+ ProduceAction.STUDY: '文化课(授業)',
238
+ ProduceAction.ALLOWANCE: '活动支给(活動支給)',
239
+ ProduceAction.REST: '休息',
240
+ ProduceAction.CONSULT: '咨询(相談)',
241
+ }
242
+ return MAP[self]
243
+
244
+
245
+ class RecommendCardDetectionMode(Enum):
246
+ NORMAL = 'normal'
247
+ STRICT = 'strict'
248
+
249
+ @property
250
+ def display_name(self):
251
+ MAP = {
252
+ RecommendCardDetectionMode.NORMAL: '正常模式',
253
+ RecommendCardDetectionMode.STRICT: '严格模式',
254
+ }
255
+ return MAP[self]
@@ -0,0 +1,28 @@
1
+ from typing import Callable, Any, Dict
2
+
3
+ # 迁移函数类型:接收单个 user_config(dict),就地修改并返回提示信息
4
+ Migration = Callable[[dict[str, Any]], str | None]
5
+
6
+ # 导入各版本迁移实现
7
+ from . import _v1_to_v2
8
+ from . import _v2_to_v3
9
+ from . import _v3_to_v4
10
+ from . import _v4_to_v5
11
+ from . import _v5_to_v6
12
+
13
+ # 注册表:键为旧版本号,值为迁移函数
14
+ MIGRATION_REGISTRY: Dict[int, Migration] = {
15
+ 1: _v1_to_v2.migrate,
16
+ 2: _v2_to_v3.migrate,
17
+ 3: _v3_to_v4.migrate,
18
+ 4: _v4_to_v5.migrate,
19
+ 5: _v5_to_v6.migrate,
20
+ }
21
+
22
+ # 当前最新配置版本
23
+ LATEST_VERSION: int = 6
24
+
25
+ __all__ = [
26
+ "MIGRATION_REGISTRY",
27
+ "LATEST_VERSION",
28
+ ]
@@ -0,0 +1,106 @@
1
+ from enum import IntEnum
2
+
3
+ 倉本千奈_BASE = 0
4
+ 十王星南_BASE = 100
5
+ 姫崎莉波_BASE = 200
6
+ 月村手毬_BASE = 300
7
+ 有村麻央_BASE = 400
8
+ 篠泽广_BASE = 500
9
+ 紫云清夏_BASE = 600
10
+ 花海佑芽_BASE = 700
11
+ 花海咲季_BASE = 800
12
+ 葛城リーリヤ_BASE = 900
13
+ 藤田ことね_BASE = 1000
14
+
15
+ class PIdol(IntEnum):
16
+ """P 偶像。(仅用于旧版配置升级。)"""
17
+ 倉本千奈_Campusmode = 倉本千奈_BASE + 0
18
+ 倉本千奈_WonderScale = 倉本千奈_BASE + 1
19
+ 倉本千奈_ようこそ初星温泉 = 倉本千奈_BASE + 2
20
+ 倉本千奈_仮装狂騒曲 = 倉本千奈_BASE + 3
21
+ 倉本千奈_初心 = 倉本千奈_BASE + 4
22
+ 倉本千奈_学園生活 = 倉本千奈_BASE + 5
23
+ 倉本千奈_日々_発見的ステップ = 倉本千奈_BASE + 6
24
+ 倉本千奈_胸を張って一歩ずつ = 倉本千奈_BASE + 7
25
+
26
+ 十王星南_Campusmode = 十王星南_BASE + 0
27
+ 十王星南_一番星 = 十王星南_BASE + 1
28
+ 十王星南_学園生活 = 十王星南_BASE + 2
29
+ 十王星南_小さな野望 = 十王星南_BASE + 3
30
+
31
+ 姫崎莉波_clumsytrick = 姫崎莉波_BASE + 0
32
+ 姫崎莉波_私らしさのはじまり = 姫崎莉波_BASE + 1
33
+ 姫崎莉波_キミとセミブルー = 姫崎莉波_BASE + 2
34
+ 姫崎莉波_Campusmode = 姫崎莉波_BASE + 3
35
+ 姫崎莉波_LUV = 姫崎莉波_BASE + 4
36
+ 姫崎莉波_ようこそ初星温泉 = 姫崎莉波_BASE + 5
37
+ 姫崎莉波_ハッピーミルフィーユ = 姫崎莉波_BASE + 6
38
+ 姫崎莉波_初心 = 姫崎莉波_BASE + 7
39
+ 姫崎莉波_学園生活 = 姫崎莉波_BASE + 8
40
+
41
+ 月村手毬_Lunasaymaybe = 月村手毬_BASE + 0
42
+ 月村手毬_一匹狼 = 月村手毬_BASE + 1
43
+ 月村手毬_Campusmode = 月村手毬_BASE + 2
44
+ 月村手毬_アイヴイ = 月村手毬_BASE + 3
45
+ 月村手毬_初声 = 月村手毬_BASE + 4
46
+ 月村手毬_学園生活 = 月村手毬_BASE + 5
47
+ 月村手毬_仮装狂騒曲 = 月村手毬_BASE + 6
48
+
49
+ 有村麻央_Fluorite = 有村麻央_BASE + 0
50
+ 有村麻央_はじまりはカッコよく = 有村麻央_BASE + 1
51
+ 有村麻央_Campusmode = 有村麻央_BASE + 2
52
+ 有村麻央_FeelJewelDream = 有村麻央_BASE + 3
53
+ 有村麻央_キミとセミブルー = 有村麻央_BASE + 4
54
+ 有村麻央_初恋 = 有村麻央_BASE + 5
55
+ 有村麻央_学園生活 = 有村麻央_BASE + 6
56
+
57
+ 篠泽广_コントラスト = 篠泽广_BASE + 0
58
+ 篠泽广_一番向いていないこと = 篠泽广_BASE + 1
59
+ 篠泽广_光景 = 篠泽广_BASE + 2
60
+ 篠泽广_Campusmode = 篠泽广_BASE + 3
61
+ 篠泽广_仮装狂騒曲 = 篠泽广_BASE + 4
62
+ 篠泽广_ハッピーミルフィーユ = 篠泽广_BASE + 5
63
+ 篠泽广_初恋 = 篠泽广_BASE + 6
64
+ 篠泽广_学園生活 = 篠泽广_BASE + 7
65
+
66
+ 紫云清夏_TameLieOneStep = 紫云清夏_BASE + 0
67
+ 紫云清夏_カクシタワタシ = 紫云清夏_BASE + 1
68
+ 紫云清夏_夢へのリスタート = 紫云清夏_BASE + 2
69
+ 紫云清夏_Campusmode = 紫云清夏_BASE + 3
70
+ 紫云清夏_キミとセミブルー = 紫云清夏_BASE + 4
71
+ 紫云清夏_初恋 = 紫云清夏_BASE + 5
72
+ 紫云清夏_学園生活 = 紫云清夏_BASE + 6
73
+
74
+ 花海佑芽_WhiteNightWhiteWish = 花海佑芽_BASE + 0
75
+ 花海佑芽_学園生活 = 花海佑芽_BASE + 1
76
+ 花海佑芽_Campusmode = 花海佑芽_BASE + 2
77
+ 花海佑芽_TheRollingRiceball = 花海佑芽_BASE + 3
78
+ 花海佑芽_アイドル_はじめっ = 花海佑芽_BASE + 4
79
+
80
+ 花海咲季_BoomBoomPow = 花海咲季_BASE + 0
81
+ 花海咲季_Campusmode = 花海咲季_BASE + 1
82
+ 花海咲季_FightingMyWay = 花海咲季_BASE + 2
83
+ 花海咲季_わたしが一番 = 花海咲季_BASE + 3
84
+ 花海咲季_冠菊 = 花海咲季_BASE + 4
85
+ 花海咲季_初声 = 花海咲季_BASE + 5
86
+ 花海咲季_古今東西ちょちょいのちょい = 花海咲季_BASE + 6
87
+ 花海咲季_学園生活 = 花海咲季_BASE + 7
88
+
89
+ 葛城リーリヤ_一つ踏み出した先に = 葛城リーリヤ_BASE + 0
90
+ 葛城リーリヤ_白線 = 葛城リーリヤ_BASE + 1
91
+ 葛城リーリヤ_Campusmode = 葛城リーリヤ_BASE + 2
92
+ 葛城リーリヤ_WhiteNightWhiteWish = 葛城リーリヤ_BASE + 3
93
+ 葛城リーリヤ_冠菊 = 葛城リーリヤ_BASE + 4
94
+ 葛城リーリヤ_初心 = 葛城リーリヤ_BASE + 5
95
+ 葛城リーリヤ_学園生活 = 葛城リーリヤ_BASE + 6
96
+
97
+ 藤田ことね_カワイイ_はじめました = 藤田ことね_BASE + 0
98
+ 藤田ことね_世界一可愛い私 = 藤田ことね_BASE + 1
99
+ 藤田ことね_Campusmode = 藤田ことね_BASE + 2
100
+ 藤田ことね_YellowBigBang = 藤田ことね_BASE + 3
101
+ 藤田ことね_WhiteNightWhiteWish =藤田ことね_BASE + 4
102
+ 藤田ことね_冠菊 = 藤田ことね_BASE + 5
103
+ 藤田ことね_初声 = 藤田ことね_BASE + 6
104
+ 藤田ことね_学園生活 = 藤田ことね_BASE + 7
105
+
106
+ __all__ = ["PIdol"]
@@ -0,0 +1,203 @@
1
+ """v1 -> v2 迁移脚本
2
+
3
+ 1. 将 PIdol 字符串列表转换为整数枚举值。
4
+ """
5
+ from __future__ import annotations
6
+
7
+ import logging
8
+ from typing import Any
9
+
10
+ from ._idol import PIdol
11
+
12
+ logger = logging.getLogger(__name__)
13
+
14
+
15
+ def migrate(user_config: dict[str, Any]) -> str | None: # noqa: D401
16
+ """执行 v1→v2 迁移。
17
+
18
+ 参数 ``user_config`` 为单个用户配置 (dict),本函数允许就地修改。
19
+ 返回提示信息 (str);若无需提示可返回 ``None``。
20
+ """
21
+ options = user_config.get("options")
22
+ if options is None:
23
+ logger.debug("No 'options' in user_config, skip v1→v2 migration.")
24
+ return None
25
+
26
+ msg: str = ""
27
+
28
+ # 将旧格式的 idol 描述 (list[str]) 映射到 PIdol 枚举
29
+ def map_idol(idol: list[str]) -> PIdol | None:
30
+ logger.debug("Converting idol spec: %s", idol)
31
+ # 以下内容直接复制自旧实现
32
+ match idol:
33
+ case ["倉本千奈", "Campus mode!!"]:
34
+ return PIdol.倉本千奈_Campusmode
35
+ case ["倉本千奈", "Wonder Scale"]:
36
+ return PIdol.倉本千奈_WonderScale
37
+ case ["倉本千奈", "ようこそ初星温泉"]:
38
+ return PIdol.倉本千奈_ようこそ初星温泉
39
+ case ["倉本千奈", "仮装狂騒曲"]:
40
+ return PIdol.倉本千奈_仮装狂騒曲
41
+ case ["倉本千奈", "初心"]:
42
+ return PIdol.倉本千奈_初心
43
+ case ["倉本千奈", "学園生活"]:
44
+ return PIdol.倉本千奈_学園生活
45
+ case ["倉本千奈", "日々、発見的ステップ!"]:
46
+ return PIdol.倉本千奈_日々_発見的ステップ
47
+ case ["倉本千奈", "胸を張って一歩ずつ"]:
48
+ return PIdol.倉本千奈_胸を張って一歩ずつ
49
+ case ["十王星南", "Campus mode!!"]:
50
+ return PIdol.十王星南_Campusmode
51
+ case ["十王星南", "一番星"]:
52
+ return PIdol.十王星南_一番星
53
+ case ["十王星南", "学園生活"]:
54
+ return PIdol.十王星南_学園生活
55
+ case ["十王星南", "小さな野望"]:
56
+ return PIdol.十王星南_小さな野望
57
+ case ["姫崎莉波", "clumsy trick"]:
58
+ return PIdol.姫崎莉波_clumsytrick
59
+ case ["姫崎莉波", "『私らしさ』のはじまり"]:
60
+ return PIdol.姫崎莉波_私らしさのはじまり
61
+ case ["姫崎莉波", "キミとセミブルー"]:
62
+ return PIdol.姫崎莉波_キミとセミブルー
63
+ case ["姫崎莉波", "Campus mode!!"]:
64
+ return PIdol.姫崎莉波_Campusmode
65
+ case ["姫崎莉波", "L.U.V"]:
66
+ return PIdol.姫崎莉波_LUV
67
+ case ["姫崎莉波", "ようこそ初星温泉"]:
68
+ return PIdol.姫崎莉波_ようこそ初星温泉
69
+ case ["姫崎莉波", "ハッピーミルフィーユ"]:
70
+ return PIdol.姫崎莉波_ハッピーミルフィーユ
71
+ case ["姫崎莉波", "初心"]:
72
+ return PIdol.姫崎莉波_初心
73
+ case ["姫崎莉波", "学園生活"]:
74
+ return PIdol.姫崎莉波_学園生活
75
+ case ["月村手毬", "Luna say maybe"]:
76
+ return PIdol.月村手毬_Lunasaymaybe
77
+ case ["月村手毬", "一匹狼"]:
78
+ return PIdol.月村手毬_一匹狼
79
+ case ["月村手毬", "Campus mode!!"]:
80
+ return PIdol.月村手毬_Campusmode
81
+ case ["月村手毬", "アイヴイ"]:
82
+ return PIdol.月村手毬_アイヴイ
83
+ case ["月村手毬", "初声"]:
84
+ return PIdol.月村手毬_初声
85
+ case ["月村手毬", "学園生活"]:
86
+ return PIdol.月村手毬_学園生活
87
+ case ["月村手毬", "仮装狂騒曲"]:
88
+ return PIdol.月村手毬_仮装狂騒曲
89
+ case ["有村麻央", "Fluorite"]:
90
+ return PIdol.有村麻央_Fluorite
91
+ case ["有村麻央", "はじまりはカッコよく"]:
92
+ return PIdol.有村麻央_はじまりはカッコよく
93
+ case ["有村麻央", "Campus mode!!"]:
94
+ return PIdol.有村麻央_Campusmode
95
+ case ["有村麻央", "Feel Jewel Dream"]:
96
+ return PIdol.有村麻央_FeelJewelDream
97
+ case ["有村麻央", "キミとセミブルー"]:
98
+ return PIdol.有村麻央_キミとセミブルー
99
+ case ["有村麻央", "初恋"]:
100
+ return PIdol.有村麻央_初恋
101
+ case ["有村麻央", "学園生活"]:
102
+ return PIdol.有村麻央_学園生活
103
+ case ["篠泽广", "コントラスト"]:
104
+ return PIdol.篠泽广_コントラスト
105
+ case ["篠泽广", "一番向いていないこと"]:
106
+ return PIdol.篠泽广_一番向いていないこと
107
+ case ["篠泽广", "光景"]:
108
+ return PIdol.篠泽广_光景
109
+ case ["篠泽广", "Campus mode!!"]:
110
+ return PIdol.篠泽广_Campusmode
111
+ case ["篠泽广", "仮装狂騒曲"]:
112
+ return PIdol.篠泽广_仮装狂騒曲
113
+ case ["篠泽广", "ハッピーミルフィーユ"]:
114
+ return PIdol.篠泽广_ハッピーミルフィーユ
115
+ case ["篠泽广", "初恋"]:
116
+ return PIdol.篠泽广_初恋
117
+ case ["篠泽广", "学園生活"]:
118
+ return PIdol.篠泽广_学園生活
119
+ case ["紫云清夏", "Tame Lie One Step"]:
120
+ return PIdol.紫云清夏_TameLieOneStep
121
+ case ["紫云清夏", "カクシタワタシ"]:
122
+ return PIdol.紫云清夏_カクシタワタシ
123
+ case ["紫云清夏", "夢へのリスタート"]:
124
+ return PIdol.紫云清夏_夢へのリスタート
125
+ case ["紫云清夏", "Campus mode!!"]:
126
+ return PIdol.紫云清夏_Campusmode
127
+ case ["紫云清夏", "キミとセミブルー"]:
128
+ return PIdol.紫云清夏_キミとセミブルー
129
+ case ["紫云清夏", "初恋"]:
130
+ return PIdol.紫云清夏_初恋
131
+ case ["紫云清夏", "学園生活"]:
132
+ return PIdol.紫云清夏_学園生活
133
+ case ["花海佑芽", "White Night! White Wish!"]:
134
+ return PIdol.花海佑芽_WhiteNightWhiteWish
135
+ case ["花海佑芽", "学園生活"]:
136
+ return PIdol.花海佑芽_学園生活
137
+ case ["花海佑芽", "Campus mode!!"]:
138
+ return PIdol.花海佑芽_Campusmode
139
+ case ["花海佑芽", "The Rolling Riceball"]:
140
+ return PIdol.花海佑芽_TheRollingRiceball
141
+ case ["花海佑芽", "アイドル、はじめっ!"]:
142
+ return PIdol.花海佑芽_アイドル_はじめっ
143
+ case ["花海咲季", "Boom Boom Pow"]:
144
+ return PIdol.花海咲季_BoomBoomPow
145
+ case ["花海咲季", "Campus mode!!"]:
146
+ return PIdol.花海咲季_Campusmode
147
+ case ["花海咲季", "Fighting My Way"]:
148
+ return PIdol.花海咲季_FightingMyWay
149
+ case ["花海咲季", "わたしが一番!"]:
150
+ return PIdol.花海咲季_わたしが一番
151
+ case ["花海咲季", "冠菊"]:
152
+ return PIdol.花海咲季_冠菊
153
+ case ["花海咲季", "初声"]:
154
+ return PIdol.花海咲季_初声
155
+ case ["花海咲季", "古今東西ちょちょいのちょい"]:
156
+ return PIdol.花海咲季_古今東西ちょちょいのちょい
157
+ case ["花海咲季", "学園生活"]:
158
+ return PIdol.花海咲季_学園生活
159
+ case ["葛城リーリヤ", "一つ踏み出した先に"]:
160
+ return PIdol.葛城リーリヤ_一つ踏み出した先に
161
+ case ["葛城リーリヤ", "白線"]:
162
+ return PIdol.葛城リーリヤ_白線
163
+ case ["葛城リーリヤ", "Campus mode!!"]:
164
+ return PIdol.葛城リーリヤ_Campusmode
165
+ case ["葛城リーリヤ", "White Night! White Wish!"]:
166
+ return PIdol.葛城リーリヤ_WhiteNightWhiteWish
167
+ case ["葛城リーリヤ", "冠菊"]:
168
+ return PIdol.葛城リーリヤ_冠菊
169
+ case ["葛城リーリヤ", "初心"]:
170
+ return PIdol.葛城リーリヤ_初心
171
+ case ["葛城リーリヤ", "学園生活"]:
172
+ return PIdol.葛城リーリヤ_学園生活
173
+ case ["藤田ことね", "カワイイ", "はじめました"]:
174
+ return PIdol.藤田ことね_カワイイ_はじめました
175
+ case ["藤田ことね", "世界一可愛い私"]:
176
+ return PIdol.藤田ことね_世界一可愛い私
177
+ case ["藤田ことね", "Campus mode!!"]:
178
+ return PIdol.藤田ことね_Campusmode
179
+ case ["藤田ことね", "Yellow Big Bang!"]:
180
+ return PIdol.藤田ことね_YellowBigBang
181
+ case ["藤田ことね", "White Night! White Wish!"]:
182
+ return PIdol.藤田ことね_WhiteNightWhiteWish
183
+ case ["藤田ことね", "冠菊"]:
184
+ return PIdol.藤田ことね_冠菊
185
+ case ["藤田ことね", "初声"]:
186
+ return PIdol.藤田ことね_初声
187
+ case ["藤田ことね", "学園生活"]:
188
+ return PIdol.藤田ことね_学園生活
189
+ case _:
190
+ nonlocal msg
191
+ if msg == "":
192
+ msg = "培育设置中的以下偶像升级失败。请尝试手动添加。\n"
193
+ msg += f"{idol} 未找到\n"
194
+ return None
195
+
196
+ produce_conf = options.get("produce", {})
197
+ old_idols = produce_conf.get("idols", [])
198
+ new_idols = list(filter(lambda x: x is not None, map(map_idol, old_idols)))
199
+ produce_conf["idols"] = new_idols
200
+ options["produce"] = produce_conf
201
+ user_config["options"] = options
202
+
203
+ return msg or None