ksaa 2025.5.16.1__py3-none-any.whl → 2025.5.23.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- kotonebot/__init__.py +0 -2
- kotonebot/backend/bot.py +19 -34
- kotonebot/backend/color.py +20 -17
- kotonebot/backend/context/context.py +41 -8
- kotonebot/backend/core.py +7 -30
- kotonebot/backend/dispatch.py +1 -1
- kotonebot/backend/image.py +26 -26
- kotonebot/backend/ocr.py +18 -17
- kotonebot/backend/preprocessor.py +0 -1
- kotonebot/client/__init__.py +8 -1
- kotonebot/client/device.py +7 -20
- kotonebot/client/factory.py +33 -5
- kotonebot/client/host/__init__.py +8 -1
- kotonebot/client/host/custom.py +7 -2
- kotonebot/client/host/leidian_host.py +200 -0
- kotonebot/client/host/mumu12_host.py +177 -0
- kotonebot/client/host/protocol.py +68 -38
- kotonebot/client/implements/adb.py +1 -1
- kotonebot/client/protocol.py +1 -1
- kotonebot/config/base_config.py +8 -3
- kotonebot/interop/win/reg.py +37 -0
- kotonebot/kaa/common.py +18 -2
- kotonebot/kaa/game_ui/badge.py +6 -6
- kotonebot/kaa/game_ui/common.py +6 -6
- kotonebot/kaa/game_ui/commu_event_buttons.py +4 -3
- kotonebot/kaa/game_ui/idols_overview.py +6 -6
- kotonebot/kaa/game_ui/schedule.py +162 -0
- kotonebot/kaa/game_ui/scrollable.py +7 -6
- kotonebot/kaa/kaa_context.py +8 -0
- kotonebot/kaa/main/cli.py +7 -0
- kotonebot/kaa/main/dmm_host.py +53 -0
- kotonebot/kaa/main/gr.py +508 -298
- kotonebot/kaa/main/kaa.py +77 -1
- kotonebot/kaa/metadata.py +26 -0
- kotonebot/kaa/resources/__pycache__/__init__.cpython-310.pyc +0 -0
- kotonebot/kaa/resources/game.db +0 -0
- kotonebot/kaa/resources/game_ver.txt +0 -0
- kotonebot/kaa/sprites/4503db6b-7224-4b81-9971-e7cfa56e10f2.png +0 -0
- kotonebot/kaa/tasks/R.py +137 -133
- kotonebot/kaa/tasks/daily/contest.py +123 -89
- kotonebot/kaa/tasks/daily/mission_reward.py +4 -4
- kotonebot/kaa/tasks/end_game.py +2 -9
- kotonebot/kaa/tasks/produce/cards.py +7 -6
- kotonebot/kaa/tasks/produce/common.py +16 -12
- kotonebot/kaa/tasks/produce/in_purodyuusu.py +5 -5
- kotonebot/kaa/tasks/produce/p_drink.py +4 -3
- kotonebot/kaa/tasks/produce/produce.py +5 -3
- kotonebot/kaa/tasks/start_game.py +2 -2
- kotonebot/primitives/__init__.py +17 -0
- kotonebot/primitives/geometry.py +290 -0
- kotonebot/primitives/visual.py +63 -0
- kotonebot/util.py +20 -20
- {ksaa-2025.5.16.1.dist-info → ksaa-2025.5.23.1.dist-info}/METADATA +1 -1
- {ksaa-2025.5.16.1.dist-info → ksaa-2025.5.23.1.dist-info}/RECORD +191 -183
- {ksaa-2025.5.16.1.dist-info → ksaa-2025.5.23.1.dist-info}/WHEEL +1 -1
- /kotonebot/{client/host/mumu_host.py → interop/win/__init__.py} +0 -0
- /kotonebot/kaa/sprites/{7971b595-44d3-4ce7-91ae-a8e5a25c543b.png → 02ff2b86-db5a-4850-ac98-4288a3f71ed8.png} +0 -0
- /kotonebot/kaa/sprites/{bc64dd37-48ba-45a5-af6d-457a7fb2c9fd.png → 04422a5d-2499-40fd-a08f-095ecbd051a8.png} +0 -0
- /kotonebot/kaa/sprites/{17da97eb-93c5-438f-8688-0be5b0756019.png → 0672e1c6-6abc-452c-82b3-af6eb7454cfa.png} +0 -0
- /kotonebot/kaa/sprites/{5089ea64-3f32-4520-a252-4ee278815cdd.png → 07960be4-b575-4f7f-be64-7e344dc118e0.png} +0 -0
- /kotonebot/kaa/sprites/{0f67c0a6-45d0-4953-b1a9-b5eb2c916173.png → 09cd4336-7d2a-4bce-9d08-8ac64a2bdcc3.png} +0 -0
- /kotonebot/kaa/sprites/{5ed9bef4-ab11-4186-9b21-a479eec687ce.png → 09fda5a8-c546-48f0-ae29-ebe4f4208d8b.png} +0 -0
- /kotonebot/kaa/sprites/{7dec3bd9-f8ee-430f-af54-0c03c4c91546.png → 0b5c2d3f-28b1-456f-a452-05ca006f8b33.png} +0 -0
- /kotonebot/kaa/sprites/{76b0e3b3-3438-4e88-aca8-da18c8e50ddd.png → 0c359f2a-72d4-4203-9ca3-968a1948eee8.png} +0 -0
- /kotonebot/kaa/sprites/{9e110778-1b66-4700-b462-64c1dea368da.png → 0ecc3e37-189c-40ad-9ee6-fb576b72a13b.png} +0 -0
- /kotonebot/kaa/sprites/{bbcb97e2-89b7-4de2-b480-a0442fc33b1e.png → 11c2ff97-3303-4d6d-8e4f-6da2148bbe20.png} +0 -0
- /kotonebot/kaa/sprites/{36d712ce-9227-4aef-86ee-4f78415b0c80.png → 128886a7-7629-4158-9538-3619542f775b.png} +0 -0
- /kotonebot/kaa/sprites/{ba07fa5e-3451-4520-8b10-0b240e5decec.png → 13a85dbd-e226-47cc-b6f5-c0d3b40654f5.png} +0 -0
- /kotonebot/kaa/sprites/{f71df091-fc71-48d4-8124-b3c46f4c4436.png → 13c8fa4a-0ae5-4ee1-a433-20f6c724466e.png} +0 -0
- /kotonebot/kaa/sprites/{02e69560-ec42-4453-b771-8600b5726b93.png → 18042dda-0222-4333-9d79-3afc3dc75220.png} +0 -0
- /kotonebot/kaa/sprites/{420e4ff4-82a3-4ea3-98a7-63efe65003a6.png → 18670c18-07e3-4378-a8fc-4f9b331db00f.png} +0 -0
- /kotonebot/kaa/sprites/{027dd54f-09d8-452d-8eff-66b06aecd264.png → 1959c932-1bbf-4fee-b3a1-2ecfbc6d4209.png} +0 -0
- /kotonebot/kaa/sprites/{b673cc06-14ef-4a22-b484-13a17b01b0d4.png → 1a8ec83b-ebba-4ff7-9737-104d3aa2ff98.png} +0 -0
- /kotonebot/kaa/sprites/{1e6d734e-7bc5-4f3f-a717-3931f44a7709.png → 1b6bc9ae-3f4e-4722-ae6f-d76bd65b071e.png} +0 -0
- /kotonebot/kaa/sprites/{0bd326fd-fad0-4e6c-957c-da08583ef231.png → 1e4671aa-2cdc-4432-9d83-c635e0a3d09d.png} +0 -0
- /kotonebot/kaa/sprites/{e941ae91-59bf-4a69-945b-1bcd7cf241c6.png → 2490bd58-bcf7-4c94-ab24-04e752137939.png} +0 -0
- /kotonebot/kaa/sprites/{f790aed5-b9f3-4c93-a14f-47629f53052d.png → 25cfb896-fed1-4361-ae64-fc45fc8a98dd.png} +0 -0
- /kotonebot/kaa/sprites/{6e81e54e-b69b-434a-8bbf-6e2551bddeb8.png → 2730beb1-a6c5-463d-9748-393764bc8e34.png} +0 -0
- /kotonebot/kaa/sprites/{3f0b91e1-898a-4f44-b116-38483bc30461.png → 2766af5c-4ad1-44e2-ab84-e8a6ac7bb172.png} +0 -0
- /kotonebot/kaa/sprites/{4fca090a-b94a-433a-8438-832a54ff65e8.png → 2cc68858-7af0-4a12-8c78-c4e4dcf9fff1.png} +0 -0
- /kotonebot/kaa/sprites/{04b4ccde-a374-4df3-b0fa-552ae1518348.png → 2e68066d-9a56-48cc-8711-1d4c080ee320.png} +0 -0
- /kotonebot/kaa/sprites/{4a9e612b-9e52-4eb5-a851-3e5ad68030e9.png → 32d50687-b3a2-4b34-a2f9-4418b5e14fff.png} +0 -0
- /kotonebot/kaa/sprites/{2179ff5c-7964-42b1-9a95-c0bd8af1b692.png → 344bedf1-fcca-4025-9ff6-cea99c91ddb4.png} +0 -0
- /kotonebot/kaa/sprites/{99e95c59-d5da-448d-b839-51428b2686f0.png → 346da82f-bfca-4a0f-bae4-ca9c8e4b794e.png} +0 -0
- /kotonebot/kaa/sprites/{be7504d5-48e5-404c-a74d-f7fa86acf276.png → 379a8811-932c-4c75-854f-943631c921d5.png} +0 -0
- /kotonebot/kaa/sprites/{d11d8839-90ef-433c-8555-fad5478009a0.png → 38f8f55f-e9dc-4c10-b97a-b7254d871ae9.png} +0 -0
- /kotonebot/kaa/sprites/{03c9182c-b5ba-4404-b6f9-50b06a86e102.png → 39b1738f-af9a-4c85-9315-2858f0b1d1ab.png} +0 -0
- /kotonebot/kaa/sprites/{fb529219-fc53-43e1-83ca-2313d1d33636.png → 3a58e019-6328-412a-9d2f-85a73900371e.png} +0 -0
- /kotonebot/kaa/sprites/{d4673e38-cf76-4062-9a71-0f31936fe49b.png → 3c2f70b5-9095-48d6-a012-4d68a6b0a975.png} +0 -0
- /kotonebot/kaa/sprites/{e753b92e-99bf-4d81-9673-92b5f67d129b.png → 3d016208-f8ed-45be-bfb1-ed15b231d0b8.png} +0 -0
- /kotonebot/kaa/sprites/{0b0e76ce-60cc-45cc-b204-227e59d39c26.png → 3e2af23e-041f-4128-8a78-cbd1297538cf.png} +0 -0
- /kotonebot/kaa/sprites/{edb144e1-7c82-4fcf-b426-c6294ad2112d.png → 429c30b5-7d3a-40a1-853a-ec51c8f238e7.png} +0 -0
- /kotonebot/kaa/sprites/{de619141-10a4-4447-89b3-6cabcbf52d8a.png → 440eeea3-b710-485e-ab40-80e2b6ce66f0.png} +0 -0
- /kotonebot/kaa/sprites/{1607c23d-3ab4-418b-8114-1a3bb782d246.png → 46f24175-8657-497d-97e6-1c1ee356e4cd.png} +0 -0
- /kotonebot/kaa/sprites/{3eb037db-4cd8-4c00-a655-fa73f612adfd.png → 4a128979-bf11-42fe-a966-a8f5ee143128.png} +0 -0
- /kotonebot/kaa/sprites/{7b07a31c-9e2b-4ce0-8998-ccc0592de5e0.png → 4a5ec641-38ec-46b0-83c4-d7edacb754b0.png} +0 -0
- /kotonebot/kaa/sprites/{e97e58cb-3412-4a8c-9a9e-dd45daa5ae02.png → 4a9c1ac7-0a61-4d40-b749-e8896322581f.png} +0 -0
- /kotonebot/kaa/sprites/{9fd268df-96b7-4b48-a6d1-b5da2161da8e.png → 4af7631b-3674-4491-a3fb-a514bfd6b204.png} +0 -0
- /kotonebot/kaa/sprites/{32a1072b-c359-4dad-80f6-c9ca558e5f99.png → 4c2c5378-d946-41c2-980e-afb8493f71ee.png} +0 -0
- /kotonebot/kaa/sprites/{1a668ad4-d6b0-4aed-bb99-8b1ac85659d3.png → 4c4dd8e5-5370-4381-b6d4-c260b32015cf.png} +0 -0
- /kotonebot/kaa/sprites/{32793e3b-613b-4b6d-bc2e-25f9993f6274.png → 4c5b8c40-3dfa-4091-95c3-257a36e9a6d3.png} +0 -0
- /kotonebot/kaa/sprites/{d3fa5988-1184-4478-abb9-1c9799bd4100.png → 4d0b8533-b3e2-4ea1-8204-a8d5e67e1f64.png} +0 -0
- /kotonebot/kaa/sprites/{0de838fb-24e9-4fe8-8e2a-cc26bce6d7d8.png → 50e462d5-ca14-4934-b35a-da3ebb8fb33f.png} +0 -0
- /kotonebot/kaa/sprites/{d2830bf7-e0c4-4d00-868a-6df22bdf6fcd.png → 557389eb-d0da-4c5a-a322-de3e32a81909.png} +0 -0
- /kotonebot/kaa/sprites/{979c7468-d9ef-4cc1-9449-2aa716caabb0.png → 57b7006a-ada9-4d9d-9655-71765251882e.png} +0 -0
- /kotonebot/kaa/sprites/{8f39322e-92d2-4cc6-80ef-341884b0a598.png → 59ef821b-4803-4fe3-83b8-305902f8459a.png} +0 -0
- /kotonebot/kaa/sprites/{a0b83694-4945-4476-aa2e-f268841ac372.png → 5af71b93-310c-48ab-b438-dba296fb9e52.png} +0 -0
- /kotonebot/kaa/sprites/{a03e79b3-7f44-4211-b625-2510ba8031bc.png → 5b6b5bf8-cd03-4360-9550-e15d8db6241a.png} +0 -0
- /kotonebot/kaa/sprites/{2fd33c51-b3a7-4ffb-9555-d25961186eee.png → 5d963589-623d-4a49-9c72-af91134720b0.png} +0 -0
- /kotonebot/kaa/sprites/{f4c8a757-674e-45ca-af2c-0bc409b7bca8.png → 5f01b811-9aad-4439-a70b-c099a42c36fa.png} +0 -0
- /kotonebot/kaa/sprites/{a1c29e77-138c-4580-a777-666815039524.png → 601d0743-7143-4c04-989b-b80fc620e678.png} +0 -0
- /kotonebot/kaa/sprites/{4aed7e90-76b1-4837-a6ad-e2ed2e3240ec.png → 63e71ec7-6290-4efa-89cf-69c53d805a58.png} +0 -0
- /kotonebot/kaa/sprites/{c15ad104-3814-467c-a211-1e54be35fc66.png → 66f5fab8-274c-4ab9-983d-ca2f8d90ea94.png} +0 -0
- /kotonebot/kaa/sprites/{8031a52b-afe1-4ebd-9599-1d123bc0e48b.png → 6abb63c1-025a-425e-8f33-29f83f504d75.png} +0 -0
- /kotonebot/kaa/sprites/{ad26884a-8371-420f-be89-7fe82ddaf1e8.png → 6d6550a6-f270-474e-b55c-b2017ef87ab2.png} +0 -0
- /kotonebot/kaa/sprites/{bf158b17-4d93-40f1-b9cf-4ae9226bcfc1.png → 7057e165-9ed4-485e-9609-94854ef269dd.png} +0 -0
- /kotonebot/kaa/sprites/{fa64ed03-4277-4ae2-a958-adb93c393457.png → 78c2c39e-6621-41d1-9a1e-7e171b001795.png} +0 -0
- /kotonebot/kaa/sprites/{f32e04e8-2e9a-49c2-9734-d0a02ed2d892.png → 798a9587-3f8c-424e-90af-89a08ed62ced.png} +0 -0
- /kotonebot/kaa/sprites/{b677c2ba-62da-4afd-8ba7-a9b40362b5bb.png → 7bbac9cd-417f-4bd5-975a-a8a25c7bd922.png} +0 -0
- /kotonebot/kaa/sprites/{d1a8f72b-813b-4d8a-a596-5576758d7fe2.png → 7c2f9216-56f2-4eec-8a45-1bd864316dad.png} +0 -0
- /kotonebot/kaa/sprites/{fe7e4f2b-b795-43b6-bf0a-4e65c9133a40.png → 7c992bae-5ded-473b-8e60-4dede8434e5d.png} +0 -0
- /kotonebot/kaa/sprites/{e73cacc9-08aa-4b7a-acd3-3dbe95d9f51c.png → 7e7e8772-b31a-4bbe-919e-90373a4ad5a7.png} +0 -0
- /kotonebot/kaa/sprites/{39151ffc-365e-45b2-a2f4-9d4c76d41524.png → 80171520-d132-4395-b2ed-e6451335b3d5.png} +0 -0
- /kotonebot/kaa/sprites/{04180b4a-1532-42dd-9280-0f47c1e68959.png → 82cf688e-ac85-4425-917d-10b6db9b6cc3.png} +0 -0
- /kotonebot/kaa/sprites/{ebcaaba7-57f8-4bcb-93da-a288a0fcc95e.png → 87292951-43c1-4039-9b92-c59c1b25b5f7.png} +0 -0
- /kotonebot/kaa/sprites/{4dd7db2d-3107-4fc5-8f30-cfa70bc28de1.png → 893a6bba-905e-4123-9e35-f829fd6c8b2a.png} +0 -0
- /kotonebot/kaa/sprites/{f9e0be54-237b-4092-8784-1a4d2eb43097.png → 8a605d31-3160-49d1-9098-45d8ee18e8d6.png} +0 -0
- /kotonebot/kaa/sprites/{334d4915-4600-4c81-bbb0-c52291b7d089.png → 8cb3b6c2-7fae-41cf-8f33-a0e3ea668f25.png} +0 -0
- /kotonebot/kaa/sprites/{6abe81b7-1a04-44e9-b390-affe47799c46.png → 8e1ca316-39e6-4b9f-b497-84ad8848a3e1.png} +0 -0
- /kotonebot/kaa/sprites/{f14cc536-f38c-4568-9812-d3ed95e639d3.png → 8f675963-122a-4932-9f33-07dcdcb3a51a.png} +0 -0
- /kotonebot/kaa/sprites/{0df088e0-737f-44ec-b39f-76239d087382.png → 907dc373-e2f5-4959-84cb-d7971a7fefd8.png} +0 -0
- /kotonebot/kaa/sprites/{7d5b4d44-cb46-49fb-96be-edaab5396836.png → 9359526e-c5db-4d63-adc4-08b7d704b422.png} +0 -0
- /kotonebot/kaa/sprites/{2860421f-2db8-4850-9f0c-0aca8bbf16d0.png → 96178cef-4868-4378-9f9c-c08780def3d6.png} +0 -0
- /kotonebot/kaa/sprites/{a477c873-98bd-45f0-a9a6-324e714c69cd.png → 985ec867-bc7c-47c5-8fcd-75f736f27507.png} +0 -0
- /kotonebot/kaa/sprites/{669f9e7c-b665-47a8-b4f5-fb2748bf88af.png → 9c98c4e6-5335-4c8b-92fa-24ec440b055e.png} +0 -0
- /kotonebot/kaa/sprites/{1373ec63-fd98-4be9-a925-08144f1d5ba5.png → a015cea0-d2c7-439a-b942-d4d2dad276e5.png} +0 -0
- /kotonebot/kaa/sprites/{6fec0efa-336f-4726-b1d9-dc83c23b297d.png → a05abc9d-9f0e-4d83-94bb-4f0b1e061035.png} +0 -0
- /kotonebot/kaa/sprites/{957dbdc4-8367-4a59-9bfc-d35ea11af9b8.png → a2e41d98-dd91-4e51-ba57-4f8ddfd07cfa.png} +0 -0
- /kotonebot/kaa/sprites/{8e78e1f1-ea2f-4779-a8cd-56336f936c81.png → a402b549-a4dd-4ff3-ad51-2aa5f8e620af.png} +0 -0
- /kotonebot/kaa/sprites/{ff493975-0f30-468f-a3ea-17505a2b0385.png → a5efb332-8452-49d8-ade3-882bbd445553.png} +0 -0
- /kotonebot/kaa/sprites/{dfe2fc89-eaf7-4027-bb53-dd17a9741e01.png → a9f47d53-fbef-4cb0-9d2d-845ef3d1f719.png} +0 -0
- /kotonebot/kaa/sprites/{45ae4d17-1887-4f2e-8cce-e5a4cc42e10b.png → b10596fe-22fa-4284-ab4b-1d653d4f0f07.png} +0 -0
- /kotonebot/kaa/sprites/{9cc7997f-3aeb-4b20-ae42-468ebfbc851e.png → b326c50f-c88c-4b99-80a7-046053423a19.png} +0 -0
- /kotonebot/kaa/sprites/{6d706642-441f-4bcc-b377-0fce3484be22.png → b44085c7-9777-415a-aae1-aae47c2f7321.png} +0 -0
- /kotonebot/kaa/sprites/{54d57991-e5d0-4346-b1f8-63e429d8a3fe.png → b629f0a7-df4f-4407-908b-a031c70e8b6f.png} +0 -0
- /kotonebot/kaa/sprites/{63f28640-766f-4698-b556-f0a0cbac6a1a.png → b8165178-a9ce-491a-ba57-d25c7af8533f.png} +0 -0
- /kotonebot/kaa/sprites/{0c3cc689-90f5-4c29-be80-04e2f2ab799a.png → b8eeacac-5679-42b9-a5b9-138598c8c6b6.png} +0 -0
- /kotonebot/kaa/sprites/{f89cafb7-657b-4ab4-8917-1964b242ff2e.png → b9ad5832-889a-4a5f-adc0-5dfd55126d6a.png} +0 -0
- /kotonebot/kaa/sprites/{16576157-f99b-4a64-b41b-3ee712c2304e.png → bcb95d32-32e1-4251-83de-ef5164d22a48.png} +0 -0
- /kotonebot/kaa/sprites/{7e64561b-0dab-420a-8f79-45ed6801939b.png → c0ddf15a-a6f6-42f6-86b7-e17cde60b437.png} +0 -0
- /kotonebot/kaa/sprites/{6d4f414d-ccd8-4a25-aa32-1b77ce0035d6.png → c24e874e-6a3e-472c-8745-edf7cac88954.png} +0 -0
- /kotonebot/kaa/sprites/{2b87ed7c-b01b-4ea7-ab34-ec4e37e036c0.png → c362b54d-d535-4227-8612-9bfe11fd7891.png} +0 -0
- /kotonebot/kaa/sprites/{1e7924dc-9dd4-4d54-add8-b394c75af1c7.png → c51132e9-f45c-40c9-8026-7d70b13dca8b.png} +0 -0
- /kotonebot/kaa/sprites/{5663551f-5abc-4ef8-a3fd-ba57b20cb35c.png → c60bec93-231f-498d-b3c6-0a78c9b8f37f.png} +0 -0
- /kotonebot/kaa/sprites/{89d6407a-982c-4dbc-8dd7-89cf79429eec.png → c64ff0a8-9f96-4ca7-902b-4f7298c1c431.png} +0 -0
- /kotonebot/kaa/sprites/{bda40c0d-55a9-41ad-ba8a-e8aafc52608b.png → c819d999-fef6-47bb-a94f-055d616033c7.png} +0 -0
- /kotonebot/kaa/sprites/{1b8b2a66-fb45-41d7-8441-04425a47bdeb.png → c85e58d3-ec5a-43ea-aa2a-04ee28e9ea21.png} +0 -0
- /kotonebot/kaa/sprites/{b332eb23-6653-4d17-b779-2451a3b261ab.png → c883049b-187c-4685-a63a-cff516851a95.png} +0 -0
- /kotonebot/kaa/sprites/{60f292d1-6c2d-4cfb-af76-568610817722.png → c8f0cc49-5df8-4d7a-9ef6-2f021c2380a5.png} +0 -0
- /kotonebot/kaa/sprites/{7383d7d0-8ee2-4413-b590-51cff541cab3.png → c9a8d73f-f487-45ff-aa05-a61393d27f66.png} +0 -0
- /kotonebot/kaa/sprites/{817c22a3-ecfe-4949-a784-59342e61a880.png → cb4c357f-b01b-4b95-b928-5affdf4ae684.png} +0 -0
- /kotonebot/kaa/sprites/{dff3509c-f0ec-44e2-8e0b-3c6b465d45f3.png → cc0e38b2-c2ae-4fe1-adb0-6ea73a602563.png} +0 -0
- /kotonebot/kaa/sprites/{c7a33e9e-2f1c-4171-b1f7-7d7dcc1a7bd3.png → cdd40676-b49d-42ad-9972-7149aa13d9bb.png} +0 -0
- /kotonebot/kaa/sprites/{5d912f4e-c319-4d45-85e6-de6e684a6278.png → cf76eb98-44ff-406e-913a-503a0233b4cd.png} +0 -0
- /kotonebot/kaa/sprites/{7b195535-7362-492f-8d87-b8eed15c6fc0.png → d21117c2-3679-4bb0-a5b3-5af5d12d8d3e.png} +0 -0
- /kotonebot/kaa/sprites/{7d778f82-f908-4edb-9b12-d8460589ab11.png → d37bc673-9668-4b7e-bc9d-54495129dcc0.png} +0 -0
- /kotonebot/kaa/sprites/{08750a02-0881-443a-9c69-c90a2ccf2a63.png → dac24ef9-e53d-4d95-aa09-fa694606c3ab.png} +0 -0
- /kotonebot/kaa/sprites/{31271771-5149-447c-8fae-ccc308c0a838.png → dd084696-be33-4a00-b6df-b25131b78b40.png} +0 -0
- /kotonebot/kaa/sprites/{a35aed53-ff78-41f0-9a19-c69fda40aeef.png → de1e3c4a-f6ed-467a-889c-25c01a613477.png} +0 -0
- /kotonebot/kaa/sprites/{639465a0-3c63-4307-a72c-4f9e543d2095.png → e1eb4596-73a1-471e-892b-c83cfb706bb3.png} +0 -0
- /kotonebot/kaa/sprites/{91940a9e-2cfc-423a-86d6-49429c051ea0.png → e1ec3ee5-e73c-44b6-b173-ab1c9382cba4.png} +0 -0
- /kotonebot/kaa/sprites/{096d3df5-2c95-41dd-bcc3-2e3afab47420.png → e4d076bd-7824-4496-a498-d6dc01ad90ba.png} +0 -0
- /kotonebot/kaa/sprites/{50a9e2a0-1166-4f1d-ad15-d8493ce0e49e.png → e551148d-1b0d-4518-8711-4161863c93ef.png} +0 -0
- /kotonebot/kaa/sprites/{45671af1-d731-4bb1-83f7-c9d23348308f.png → e61d855e-84d3-4a0e-b996-43fce262c2c3.png} +0 -0
- /kotonebot/kaa/sprites/{608217f6-b880-42ab-9be9-b4d56df87be2.png → e795f9c5-fdda-4fbc-8d38-a92512a590f4.png} +0 -0
- /kotonebot/kaa/sprites/{7d4d708f-c629-4f52-a0af-11aee7fcb878.png → eb446c0a-1dd2-4693-838e-98a76c02eac5.png} +0 -0
- /kotonebot/kaa/sprites/{35e6ad3a-8020-4619-b8ec-6506a8aa51fc.png → eb4bde42-de6e-4c62-8dc4-8885efc834a8.png} +0 -0
- /kotonebot/kaa/sprites/{9a5e7bc9-830f-4b01-8f94-6d4f589754c0.png → ec547e11-4952-4089-9744-1e89bd44389c.png} +0 -0
- /kotonebot/kaa/sprites/{40e3dac1-74fb-4501-a20f-18422d070554.png → ed4a8cff-b3df-4d7a-bfc4-8da776a8e548.png} +0 -0
- /kotonebot/kaa/sprites/{39d57097-6839-4030-bb51-24d6cd880897.png → efc08f1c-e78f-4df8-bff9-b45cde37f9dd.png} +0 -0
- /kotonebot/kaa/sprites/{9f56889b-0251-4ec1-8ccb-5cfd3bddd396.png → f02d997a-a3a8-4e18-96f1-e4176c14a5e0.png} +0 -0
- /kotonebot/kaa/sprites/{97bbc57d-780a-40f4-8fe1-bcaef697b601.png → f5e2e4e1-40be-481d-9293-9d47a5bce7cc.png} +0 -0
- /kotonebot/kaa/sprites/{bee4fbe2-365f-4145-b8f4-87c2c460cd71.png → f62dd2a2-bac6-4dc8-9a19-3e995ab80a3b.png} +0 -0
- /kotonebot/kaa/sprites/{666b1e8c-19fb-49e9-a761-1069f635f450.png → f64cfd95-8c87-47e6-96c3-8b7df2624ae3.png} +0 -0
- /kotonebot/kaa/sprites/{847cb208-a71c-42e3-97f1-18d4aa886b41.png → f8bcbc2c-9831-4e8d-9ffd-e532aa3193c3.png} +0 -0
- /kotonebot/kaa/sprites/{9e5c5ffc-450d-4ddc-a4ae-27c33267b056.png → fb50c7d1-b983-4e36-a998-ea17a1bdb18b.png} +0 -0
- /kotonebot/kaa/sprites/{f1a60528-1f35-451f-92e3-b1d5407e0f4e.png → fb97d804-42e4-45e2-8b22-01d16b5d0b6b.png} +0 -0
- /kotonebot/kaa/sprites/{a3140a53-ffb4-4094-a39c-240e9fe42308.png → fe337541-a6a3-4325-97b4-2bf27f51f39f.png} +0 -0
- /kotonebot/kaa/sprites/{1a0f2a10-c23b-47c7-aa7e-89b606f4d8ae.png → ffd3c6b7-cac2-4d45-ae37-792404ea2b40.png} +0 -0
- {ksaa-2025.5.16.1.dist-info → ksaa-2025.5.23.1.dist-info}/entry_points.txt +0 -0
- {ksaa-2025.5.16.1.dist-info → ksaa-2025.5.23.1.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
from typing import Generic, TypeVar, TypeGuard, overload
|
|
2
|
+
|
|
3
|
+
T = TypeVar('T')
|
|
4
|
+
|
|
5
|
+
class Vector2D(Generic[T]):
|
|
6
|
+
"""2D 坐标类"""
|
|
7
|
+
def __init__(self, x: T, y: T, *, name: str | None = None):
|
|
8
|
+
self.x = x
|
|
9
|
+
self.y = y
|
|
10
|
+
self.name: str | None = name
|
|
11
|
+
"""坐标的名称。"""
|
|
12
|
+
|
|
13
|
+
def __getitem__(self, item: int):
|
|
14
|
+
if item == 0:
|
|
15
|
+
return self.x
|
|
16
|
+
elif item == 1:
|
|
17
|
+
return self.y
|
|
18
|
+
else:
|
|
19
|
+
raise IndexError
|
|
20
|
+
|
|
21
|
+
def __repr__(self) -> str:
|
|
22
|
+
return f'Point<"{self.name}" at ({self.x}, {self.y})>'
|
|
23
|
+
|
|
24
|
+
def __str__(self) -> str:
|
|
25
|
+
return f'({self.x}, {self.y})'
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class Vector3D(Generic[T]):
|
|
29
|
+
"""三元组类。"""
|
|
30
|
+
def __init__(self, x: T, y: T, z: T, *, name: str | None = None):
|
|
31
|
+
self.x = x
|
|
32
|
+
self.y = y
|
|
33
|
+
self.z = z
|
|
34
|
+
self.name: str | None = name
|
|
35
|
+
"""坐标的名称。"""
|
|
36
|
+
|
|
37
|
+
def __getitem__(self, item: int):
|
|
38
|
+
if item == 0:
|
|
39
|
+
return self.x
|
|
40
|
+
elif item == 1:
|
|
41
|
+
return self.y
|
|
42
|
+
elif item == 2:
|
|
43
|
+
return self.z
|
|
44
|
+
else:
|
|
45
|
+
raise IndexError
|
|
46
|
+
|
|
47
|
+
@property
|
|
48
|
+
def xyz(self) -> tuple[T, T, T]:
|
|
49
|
+
"""
|
|
50
|
+
三元组 (x, y, z)。OpenCV 格式的坐标。
|
|
51
|
+
"""
|
|
52
|
+
return self.x, self.y, self.z
|
|
53
|
+
|
|
54
|
+
@property
|
|
55
|
+
def xy(self) -> tuple[T, T]:
|
|
56
|
+
"""
|
|
57
|
+
二元组 (x, y)。OpenCV 格式的坐标。
|
|
58
|
+
"""
|
|
59
|
+
return self.x, self.y
|
|
60
|
+
|
|
61
|
+
class Vector4D(Generic[T]):
|
|
62
|
+
"""四元组类。"""
|
|
63
|
+
def __init__(self, x: T, y: T, z: T, w: T, *, name: str | None = None):
|
|
64
|
+
self.x = x
|
|
65
|
+
self.y = y
|
|
66
|
+
self.z = z
|
|
67
|
+
self.w = w
|
|
68
|
+
self.name: str | None = name
|
|
69
|
+
"""坐标的名称。"""
|
|
70
|
+
|
|
71
|
+
def __getitem__(self, item: int):
|
|
72
|
+
if item == 0:
|
|
73
|
+
return self.x
|
|
74
|
+
elif item == 1:
|
|
75
|
+
return self.y
|
|
76
|
+
elif item == 2:
|
|
77
|
+
return self.z
|
|
78
|
+
elif item == 3:
|
|
79
|
+
return self.w
|
|
80
|
+
else:
|
|
81
|
+
raise IndexError
|
|
82
|
+
|
|
83
|
+
Size = Vector2D[int]
|
|
84
|
+
"""尺寸。相当于 Vector2D[int]"""
|
|
85
|
+
RectTuple = tuple[int, int, int, int]
|
|
86
|
+
"""矩形。(x, y, w, h)"""
|
|
87
|
+
PointTuple = tuple[int, int]
|
|
88
|
+
"""点。(x, y)"""
|
|
89
|
+
|
|
90
|
+
class Point(Vector2D[int]):
|
|
91
|
+
"""点。"""
|
|
92
|
+
|
|
93
|
+
@property
|
|
94
|
+
def xy(self) -> PointTuple:
|
|
95
|
+
"""
|
|
96
|
+
二元组 (x, y)。OpenCV 格式的坐标。
|
|
97
|
+
"""
|
|
98
|
+
return self.x, self.y
|
|
99
|
+
|
|
100
|
+
def offset(self, dx: int, dy: int) -> 'Point':
|
|
101
|
+
"""
|
|
102
|
+
偏移坐标。
|
|
103
|
+
|
|
104
|
+
:param dx: 偏移量。
|
|
105
|
+
:param dy: 偏移量。
|
|
106
|
+
:return: 偏移后的坐标。
|
|
107
|
+
"""
|
|
108
|
+
return Point(self.x + dx, self.y + dy, name=self.name)
|
|
109
|
+
|
|
110
|
+
def __add__(self, other: 'Point | PointTuple') -> 'Point':
|
|
111
|
+
"""
|
|
112
|
+
相加。
|
|
113
|
+
|
|
114
|
+
:param other: 另一个 Point 对象或二元组 (x: int, y: int)。
|
|
115
|
+
:return: 相加后的点。
|
|
116
|
+
"""
|
|
117
|
+
if isinstance(other, Point):
|
|
118
|
+
return Point(self.x + other.x, self.y + other.y, name=self.name)
|
|
119
|
+
else:
|
|
120
|
+
return Point(self.x + other[0], self.y + other[1], name=self.name)
|
|
121
|
+
|
|
122
|
+
def __sub__(self, other: 'Point | PointTuple') -> 'Point':
|
|
123
|
+
"""
|
|
124
|
+
相减。
|
|
125
|
+
|
|
126
|
+
:param other: 另一个 Point 对象或二元组 (x: int, y: int)。
|
|
127
|
+
:return: 相减后的点。
|
|
128
|
+
"""
|
|
129
|
+
if isinstance(other, Point):
|
|
130
|
+
return Point(self.x - other.x, self.y - other.y, name=self.name)
|
|
131
|
+
else:
|
|
132
|
+
return Point(self.x - other[0], self.y - other[1], name=self.name)
|
|
133
|
+
|
|
134
|
+
class Rect:
|
|
135
|
+
"""
|
|
136
|
+
矩形类。
|
|
137
|
+
"""
|
|
138
|
+
def __init__(
|
|
139
|
+
self,
|
|
140
|
+
x: int | None = None,
|
|
141
|
+
y: int | None = None,
|
|
142
|
+
w: int | None = None,
|
|
143
|
+
h: int | None = None,
|
|
144
|
+
*,
|
|
145
|
+
xywh: RectTuple | None = None,
|
|
146
|
+
name: str | None = None,
|
|
147
|
+
):
|
|
148
|
+
"""
|
|
149
|
+
从给定的坐标信息创建矩形。
|
|
150
|
+
|
|
151
|
+
参数 `x`, `y`, `w`, `h` 和 `xywh` 必须至少指定一组。
|
|
152
|
+
|
|
153
|
+
:param x: 矩形左上角的 X 坐标。
|
|
154
|
+
:param y: 矩形左上角的 Y 坐标。
|
|
155
|
+
:param w: 矩形的宽度。
|
|
156
|
+
:param h: 矩形的高度。
|
|
157
|
+
:param xywh: 四元组 (x, y, w, h)。
|
|
158
|
+
:param name: 矩形的名称。
|
|
159
|
+
:raises ValueError: 提供的坐标参数不完整时抛出。
|
|
160
|
+
"""
|
|
161
|
+
if xywh is not None:
|
|
162
|
+
x, y, w, h = xywh
|
|
163
|
+
elif (
|
|
164
|
+
x is not None and
|
|
165
|
+
y is not None and
|
|
166
|
+
w is not None and
|
|
167
|
+
h is not None
|
|
168
|
+
):
|
|
169
|
+
pass
|
|
170
|
+
else:
|
|
171
|
+
raise ValueError('Either xywh or x, y, w, h must be provided.')
|
|
172
|
+
|
|
173
|
+
self.x1 = x
|
|
174
|
+
"""矩形左上角的 X 坐标。"""
|
|
175
|
+
self.y1 = y
|
|
176
|
+
"""矩形左上角的 Y 坐标。"""
|
|
177
|
+
self.w = w
|
|
178
|
+
"""矩形的宽度。"""
|
|
179
|
+
self.h = h
|
|
180
|
+
"""矩形的高度。"""
|
|
181
|
+
self.name: str | None = name
|
|
182
|
+
"""矩形的名称。"""
|
|
183
|
+
|
|
184
|
+
@classmethod
|
|
185
|
+
def from_xyxy(cls, x1: int, y1: int, x2: int, y2: int) -> 'Rect':
|
|
186
|
+
"""
|
|
187
|
+
从 (x1, y1, x2, y2) 创建矩形。
|
|
188
|
+
:return: 创建结果。
|
|
189
|
+
"""
|
|
190
|
+
return cls(x1, y1, x2 - x1, y2 - y1)
|
|
191
|
+
|
|
192
|
+
@property
|
|
193
|
+
def x2(self) -> int:
|
|
194
|
+
"""矩形右下角的 X 坐标。"""
|
|
195
|
+
return self.x1 + self.w
|
|
196
|
+
|
|
197
|
+
@x2.setter
|
|
198
|
+
def x2(self, value: int):
|
|
199
|
+
self.w = value - self.x1
|
|
200
|
+
|
|
201
|
+
@property
|
|
202
|
+
def y2(self) -> int:
|
|
203
|
+
"""矩形右下角的 Y 坐标。"""
|
|
204
|
+
return self.y1 + self.h
|
|
205
|
+
|
|
206
|
+
@y2.setter
|
|
207
|
+
def y2(self, value: int):
|
|
208
|
+
self.h = value - self.y1
|
|
209
|
+
|
|
210
|
+
@property
|
|
211
|
+
def xywh(self) -> RectTuple:
|
|
212
|
+
"""
|
|
213
|
+
四元组 (x1, y1, w, h)。OpenCV 格式的坐标。
|
|
214
|
+
"""
|
|
215
|
+
return self.x1, self.y1, self.w, self.h
|
|
216
|
+
|
|
217
|
+
@property
|
|
218
|
+
def xyxy(self) -> RectTuple:
|
|
219
|
+
"""
|
|
220
|
+
四元组 (x1, y1, x2, y2)。
|
|
221
|
+
"""
|
|
222
|
+
return self.x1, self.y1, self.x2, self.y2
|
|
223
|
+
|
|
224
|
+
@property
|
|
225
|
+
def top_left(self) -> Point:
|
|
226
|
+
"""
|
|
227
|
+
矩形的左上角点。
|
|
228
|
+
"""
|
|
229
|
+
if self.name:
|
|
230
|
+
name = "Left-top of rect "+ self.name
|
|
231
|
+
else:
|
|
232
|
+
name = None
|
|
233
|
+
return Point(self.x1, self.y1, name=name)
|
|
234
|
+
|
|
235
|
+
@property
|
|
236
|
+
def bottom_right(self) -> Point:
|
|
237
|
+
"""
|
|
238
|
+
矩形的右下角点。
|
|
239
|
+
"""
|
|
240
|
+
if self.name:
|
|
241
|
+
name = "Right-bottom of rect "+ self.name
|
|
242
|
+
else:
|
|
243
|
+
name = None
|
|
244
|
+
return Point(self.x2, self.y2, name=name)
|
|
245
|
+
|
|
246
|
+
@property
|
|
247
|
+
def left_bottom(self) -> Point:
|
|
248
|
+
"""
|
|
249
|
+
矩形的左下角点。
|
|
250
|
+
"""
|
|
251
|
+
if self.name:
|
|
252
|
+
name = "Left-bottom of rect "+ self.name
|
|
253
|
+
else:
|
|
254
|
+
name = None
|
|
255
|
+
return Point(self.x1, self.y2, name=name)
|
|
256
|
+
|
|
257
|
+
@property
|
|
258
|
+
def right_top(self) -> Point:
|
|
259
|
+
"""
|
|
260
|
+
矩形的右上角点。
|
|
261
|
+
"""
|
|
262
|
+
if self.name:
|
|
263
|
+
name = "Right-top of rect "+ self.name
|
|
264
|
+
else:
|
|
265
|
+
name = None
|
|
266
|
+
return Point(self.x2, self.y1, name=name)
|
|
267
|
+
|
|
268
|
+
@property
|
|
269
|
+
def center(self) -> Point:
|
|
270
|
+
"""
|
|
271
|
+
矩形的中心点。
|
|
272
|
+
"""
|
|
273
|
+
if self.name:
|
|
274
|
+
name = "Center of rect "+ self.name
|
|
275
|
+
else:
|
|
276
|
+
name = None
|
|
277
|
+
return Point(self.x1 + self.w // 2, self.y1 + self.h // 2, name=name)
|
|
278
|
+
|
|
279
|
+
def __repr__(self) -> str:
|
|
280
|
+
return f'Rect<"{self.name}" at (x={self.x1}, y={self.y1}, w={self.w}, h={self.h})>'
|
|
281
|
+
|
|
282
|
+
def __str__(self) -> str:
|
|
283
|
+
return f'(x={self.x1}, y={self.y1}, w={self.w}, h={self.h})'
|
|
284
|
+
|
|
285
|
+
|
|
286
|
+
def is_point(obj: object) -> TypeGuard[Point]:
|
|
287
|
+
return isinstance(obj, Point)
|
|
288
|
+
|
|
289
|
+
def is_rect(obj: object) -> TypeGuard[Rect]:
|
|
290
|
+
return isinstance(obj, Rect)
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
|
|
3
|
+
from cv2.typing import MatLike
|
|
4
|
+
|
|
5
|
+
from .geometry import Size
|
|
6
|
+
from kotonebot.util import cv2_imread
|
|
7
|
+
|
|
8
|
+
logger = logging.getLogger(__name__)
|
|
9
|
+
|
|
10
|
+
class Image:
|
|
11
|
+
"""
|
|
12
|
+
图像类。
|
|
13
|
+
"""
|
|
14
|
+
def __init__(
|
|
15
|
+
self,
|
|
16
|
+
pixels: MatLike | None = None,
|
|
17
|
+
file_path: str | None = None,
|
|
18
|
+
lazy_load: bool = False,
|
|
19
|
+
name: str | None = None,
|
|
20
|
+
description: str | None = None
|
|
21
|
+
):
|
|
22
|
+
"""
|
|
23
|
+
从内存数据或图像文件创建图像类。
|
|
24
|
+
|
|
25
|
+
:param pixels: 图像数据。格式必须为 BGR。
|
|
26
|
+
:param file_path: 图像文件路径。
|
|
27
|
+
:param lazy_load: 是否延迟加载图像数据。
|
|
28
|
+
若为 False,立即载入,否则仅当访问图像数据时才载入。仅当从文件创建图像类时生效。
|
|
29
|
+
:param name: 图像名称。
|
|
30
|
+
:param description: 图像描述。
|
|
31
|
+
"""
|
|
32
|
+
self.name: str | None = name
|
|
33
|
+
"""图像名称。"""
|
|
34
|
+
self.description: str | None = description
|
|
35
|
+
"""图像描述。"""
|
|
36
|
+
self.file_path: str | None = file_path
|
|
37
|
+
"""图像的文件路径。"""
|
|
38
|
+
self.__pixels: MatLike | None = None
|
|
39
|
+
# 立即加载
|
|
40
|
+
if not lazy_load and self.file_path:
|
|
41
|
+
_ = self.pixels
|
|
42
|
+
# 传入像素数据而不是文件
|
|
43
|
+
if pixels is not None:
|
|
44
|
+
self.__pixels = pixels
|
|
45
|
+
|
|
46
|
+
@property
|
|
47
|
+
def pixels(self) -> MatLike:
|
|
48
|
+
"""图像的像素数据。"""
|
|
49
|
+
if self.__pixels is None:
|
|
50
|
+
if not self.file_path:
|
|
51
|
+
raise ValueError('Either pixels or file_path must be provided.')
|
|
52
|
+
logger.debug('Loading image "%s" from %s...', self.name or '(unnamed)', self.file_path)
|
|
53
|
+
self.__pixels = cv2_imread(self.file_path)
|
|
54
|
+
return self.__pixels
|
|
55
|
+
|
|
56
|
+
@property
|
|
57
|
+
def size(self) -> Size:
|
|
58
|
+
return Size(self.pixels.shape[1], self.pixels.shape[0])
|
|
59
|
+
|
|
60
|
+
class Template(Image):
|
|
61
|
+
"""
|
|
62
|
+
模板图像类。
|
|
63
|
+
"""
|
kotonebot/util.py
CHANGED
|
@@ -20,16 +20,16 @@ logger = logging.getLogger(__name__)
|
|
|
20
20
|
|
|
21
21
|
|
|
22
22
|
|
|
23
|
-
Rect = tuple[int, int, int, int]
|
|
24
|
-
"""左上X, 左上Y, 宽度, 高度"""
|
|
25
|
-
Point = tuple[int, int]
|
|
26
|
-
"""X, Y"""
|
|
27
|
-
|
|
28
|
-
def is_rect(rect: typing.Any) -> TypeGuard[Rect]:
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
def is_point(point: typing.Any) -> TypeGuard[Point]:
|
|
32
|
-
|
|
23
|
+
# Rect = tuple[int, int, int, int]
|
|
24
|
+
# """左上X, 左上Y, 宽度, 高度"""
|
|
25
|
+
# Point = tuple[int, int]
|
|
26
|
+
# """X, Y"""
|
|
27
|
+
#
|
|
28
|
+
# def is_rect(rect: typing.Any) -> TypeGuard[Rect]:
|
|
29
|
+
# return isinstance(rect, typing.Sequence) and len(rect) == 4 and all(isinstance(i, int) for i in rect)
|
|
30
|
+
#
|
|
31
|
+
# def is_point(point: typing.Any) -> TypeGuard[Point]:
|
|
32
|
+
# return isinstance(point, typing.Sequence) and len(point) == 2 and all(isinstance(i, int) for i in point)
|
|
33
33
|
|
|
34
34
|
@deprecated('使用 HintBox 类与 Devtool 工具替代')
|
|
35
35
|
def crop(img: MatLike, /, x1: float = 0, y1: float = 0, x2: float = 1, y2: float = 1) -> MatLike:
|
|
@@ -49,16 +49,16 @@ def crop(img: MatLike, /, x1: float = 0, y1: float = 0, x2: float = 1, y2: float
|
|
|
49
49
|
y2_px = int(h * y2)
|
|
50
50
|
return img[y1_px:y2_px, x1_px:x2_px]
|
|
51
51
|
|
|
52
|
-
@deprecated('使用 numpy 的切片替代')
|
|
53
|
-
def crop_rect(img: MatLike, rect: Rect) -> MatLike:
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
52
|
+
# @deprecated('使用 numpy 的切片替代')
|
|
53
|
+
# def crop_rect(img: MatLike, rect: Rect) -> MatLike:
|
|
54
|
+
# """
|
|
55
|
+
# 按范围裁剪图像。
|
|
56
|
+
#
|
|
57
|
+
# :param img: 图像
|
|
58
|
+
# :param rect: 裁剪区域。
|
|
59
|
+
# """
|
|
60
|
+
# x, y, w, h = rect
|
|
61
|
+
# return img[y:y+h, x:x+w]
|
|
62
62
|
|
|
63
63
|
class DeviceHookContextManager:
|
|
64
64
|
def __init__(
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ksaa
|
|
3
|
-
Version: 2025.5.
|
|
3
|
+
Version: 2025.5.23.1
|
|
4
4
|
Summary: Kotones Auto Assistant(kaa) is a script for game 'Gakuen Idol M@ster' that automates the dailies and produces.
|
|
5
5
|
Requires-Python: ~=3.10
|
|
6
6
|
Description-Content-Type: text/markdown
|