kotonebot 0.3.1__py3-none-any.whl → 0.5.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 (66) hide show
  1. kotonebot/__init__.py +39 -39
  2. kotonebot/backend/bot.py +312 -302
  3. kotonebot/backend/color.py +525 -525
  4. kotonebot/backend/context/__init__.py +3 -3
  5. kotonebot/backend/context/context.py +49 -56
  6. kotonebot/backend/context/task_action.py +183 -175
  7. kotonebot/backend/core.py +129 -126
  8. kotonebot/backend/debug/entry.py +89 -89
  9. kotonebot/backend/debug/mock.py +78 -78
  10. kotonebot/backend/debug/server.py +222 -222
  11. kotonebot/backend/debug/vars.py +351 -351
  12. kotonebot/backend/dispatch.py +227 -227
  13. kotonebot/backend/flow_controller.py +196 -196
  14. kotonebot/backend/loop.py +12 -88
  15. kotonebot/backend/ocr.py +535 -529
  16. kotonebot/backend/preprocessor.py +103 -103
  17. kotonebot/client/__init__.py +9 -9
  18. kotonebot/client/device.py +528 -502
  19. kotonebot/client/fast_screenshot.py +377 -377
  20. kotonebot/client/host/__init__.py +43 -12
  21. kotonebot/client/host/adb_common.py +107 -94
  22. kotonebot/client/host/custom.py +118 -114
  23. kotonebot/client/host/leidian_host.py +196 -201
  24. kotonebot/client/host/mumu12_host.py +353 -358
  25. kotonebot/client/host/protocol.py +214 -213
  26. kotonebot/client/host/windows_common.py +58 -55
  27. kotonebot/client/implements/__init__.py +71 -7
  28. kotonebot/client/implements/adb.py +89 -85
  29. kotonebot/client/implements/adb_raw.py +162 -158
  30. kotonebot/client/implements/nemu_ipc/__init__.py +11 -7
  31. kotonebot/client/implements/nemu_ipc/external_renderer_ipc.py +284 -284
  32. kotonebot/client/implements/nemu_ipc/nemu_ipc.py +327 -327
  33. kotonebot/client/implements/remote_windows.py +188 -192
  34. kotonebot/client/implements/uiautomator2.py +85 -81
  35. kotonebot/client/implements/windows.py +176 -168
  36. kotonebot/client/protocol.py +69 -69
  37. kotonebot/client/registration.py +24 -24
  38. kotonebot/config/base_config.py +96 -96
  39. kotonebot/config/manager.py +36 -36
  40. kotonebot/errors.py +76 -71
  41. kotonebot/interop/win/__init__.py +10 -0
  42. kotonebot/interop/win/_mouse.py +311 -0
  43. kotonebot/interop/win/message_box.py +313 -313
  44. kotonebot/interop/win/reg.py +37 -37
  45. kotonebot/interop/win/shortcut.py +43 -43
  46. kotonebot/interop/win/task_dialog.py +513 -469
  47. kotonebot/logging/__init__.py +2 -2
  48. kotonebot/logging/log.py +17 -17
  49. kotonebot/primitives/__init__.py +17 -17
  50. kotonebot/primitives/geometry.py +862 -290
  51. kotonebot/primitives/visual.py +63 -63
  52. kotonebot/tools/mirror.py +354 -354
  53. kotonebot/ui/file_host/sensio.py +36 -36
  54. kotonebot/ui/file_host/tmp_send.py +54 -54
  55. kotonebot/ui/pushkit/__init__.py +3 -3
  56. kotonebot/ui/pushkit/image_host.py +88 -87
  57. kotonebot/ui/pushkit/protocol.py +13 -13
  58. kotonebot/ui/pushkit/wxpusher.py +54 -53
  59. kotonebot/ui/user.py +148 -143
  60. kotonebot/util.py +436 -409
  61. {kotonebot-0.3.1.dist-info → kotonebot-0.5.0.dist-info}/METADATA +82 -76
  62. kotonebot-0.5.0.dist-info/RECORD +71 -0
  63. {kotonebot-0.3.1.dist-info → kotonebot-0.5.0.dist-info}/licenses/LICENSE +673 -673
  64. kotonebot-0.3.1.dist-info/RECORD +0 -70
  65. {kotonebot-0.3.1.dist-info → kotonebot-0.5.0.dist-info}/WHEEL +0 -0
  66. {kotonebot-0.3.1.dist-info → kotonebot-0.5.0.dist-info}/top_level.txt +0 -0
@@ -1,103 +1,103 @@
1
- from typing import Protocol, Literal
2
-
3
- import cv2
4
- import numpy as np
5
- from cv2.typing import MatLike
6
-
7
- ImageFormat = Literal['bgr', 'hsv']
8
-
9
- class PreprocessorProtocol(Protocol):
10
- """预处理协议。用于 Image 与 Ocr 中的 `preprocessor` 参数。"""
11
- def process(self, image: MatLike, *, format: ImageFormat = 'bgr') -> MatLike:
12
- """
13
- 预处理图像。
14
-
15
- :param image: 输入图像。
16
- :param format: 输入图像的格式,可选值为 'bgr' 或 'hsv'。
17
- :return: 预处理后的图像,格式不限。
18
- """
19
- ...
20
-
21
- class HsvColorFilter(PreprocessorProtocol):
22
- """HSV 颜色过滤器。用于保留指定颜色。"""
23
- def __init__(
24
- self,
25
- lower: tuple[int, int, int],
26
- upper: tuple[int, int, int],
27
- *,
28
- name: str | None = None,
29
- ):
30
- self.lower = np.array(lower)
31
- self.upper = np.array(upper)
32
- self.name = name
33
-
34
- def process(self, image: MatLike, *, format: ImageFormat = 'bgr') -> MatLike:
35
- if format == 'bgr':
36
- hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
37
- elif format == 'hsv':
38
- hsv = image
39
- else:
40
- raise ValueError(f'Invalid format: {format}')
41
- mask = cv2.inRange(hsv, self.lower, self.upper)
42
- return mask
43
-
44
- def __repr__(self) -> str:
45
- return f'HsvColorFilter(for color "{self.name}" with range {self.lower} - {self.upper})'
46
-
47
- class HsvColorRemover(PreprocessorProtocol):
48
- """去除指定范围内的 HSV 颜色。"""
49
-
50
- def __init__(
51
- self,
52
- lower: tuple[int, int, int],
53
- upper: tuple[int, int, int],
54
- *,
55
- name: str | None = None,
56
- ):
57
- self.lower = np.array(lower)
58
- self.upper = np.array(upper)
59
- self.name = name
60
-
61
- def process(self, image: MatLike, *, format: ImageFormat = 'bgr') -> MatLike:
62
- if format == 'bgr':
63
- hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
64
- elif format == 'hsv':
65
- hsv = image
66
- else:
67
- raise ValueError(f'Invalid format: {format}')
68
- mask = cv2.inRange(hsv, self.lower, self.upper)
69
- mask = cv2.bitwise_not(mask)
70
- result = cv2.bitwise_and(image, image, mask=mask)
71
- return result
72
-
73
- def __repr__(self) -> str:
74
- return f'HsvColorRemover(for color "{self.name}" with range {self.lower} - {self.upper})'
75
-
76
- class HsvColorsRemover(PreprocessorProtocol):
77
- """去除多个指定范围内的 HSV 颜色。"""
78
- def __init__(
79
- self,
80
- colors: list[tuple[tuple[int, int, int], tuple[int, int, int]]],
81
- *,
82
- name: str | None = None,
83
- ):
84
- self.colors = colors
85
- self.name = name
86
- self.__preprocessors = [
87
- HsvColorRemover(color[0], color[1], name=name) for color in colors
88
- ]
89
-
90
- def process(self, image: MatLike, *, format: ImageFormat = 'bgr') -> MatLike:
91
- if format == 'bgr':
92
- hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
93
- elif format == 'hsv':
94
- hsv = image
95
- else:
96
- raise ValueError(f'Invalid format: {format}')
97
-
98
- for p in self.__preprocessors:
99
- hsv = p.process(hsv, format='hsv')
100
- return hsv
101
-
102
- def __repr__(self) -> str:
103
- return f'HsvColorsRemover(for colors {self.colors})'
1
+ from typing import Protocol, Literal
2
+
3
+ import cv2
4
+ import numpy as np
5
+ from cv2.typing import MatLike
6
+
7
+ ImageFormat = Literal['bgr', 'hsv']
8
+
9
+ class PreprocessorProtocol(Protocol):
10
+ """预处理协议。用于 Image 与 Ocr 中的 `preprocessor` 参数。"""
11
+ def process(self, image: MatLike, *, format: ImageFormat = 'bgr') -> MatLike:
12
+ """
13
+ 预处理图像。
14
+
15
+ :param image: 输入图像。
16
+ :param format: 输入图像的格式,可选值为 'bgr' 或 'hsv'。
17
+ :return: 预处理后的图像,格式不限。
18
+ """
19
+ ...
20
+
21
+ class HsvColorFilter(PreprocessorProtocol):
22
+ """HSV 颜色过滤器。用于保留指定颜色。"""
23
+ def __init__(
24
+ self,
25
+ lower: tuple[int, int, int],
26
+ upper: tuple[int, int, int],
27
+ *,
28
+ name: str | None = None,
29
+ ):
30
+ self.lower = np.array(lower)
31
+ self.upper = np.array(upper)
32
+ self.name = name
33
+
34
+ def process(self, image: MatLike, *, format: ImageFormat = 'bgr') -> MatLike:
35
+ if format == 'bgr':
36
+ hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
37
+ elif format == 'hsv':
38
+ hsv = image
39
+ else:
40
+ raise ValueError(f'Invalid format: {format}')
41
+ mask = cv2.inRange(hsv, self.lower, self.upper)
42
+ return mask
43
+
44
+ def __repr__(self) -> str:
45
+ return f'HsvColorFilter(for color "{self.name}" with range {self.lower} - {self.upper})'
46
+
47
+ class HsvColorRemover(PreprocessorProtocol):
48
+ """去除指定范围内的 HSV 颜色。"""
49
+
50
+ def __init__(
51
+ self,
52
+ lower: tuple[int, int, int],
53
+ upper: tuple[int, int, int],
54
+ *,
55
+ name: str | None = None,
56
+ ):
57
+ self.lower = np.array(lower)
58
+ self.upper = np.array(upper)
59
+ self.name = name
60
+
61
+ def process(self, image: MatLike, *, format: ImageFormat = 'bgr') -> MatLike:
62
+ if format == 'bgr':
63
+ hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
64
+ elif format == 'hsv':
65
+ hsv = image
66
+ else:
67
+ raise ValueError(f'Invalid format: {format}')
68
+ mask = cv2.inRange(hsv, self.lower, self.upper)
69
+ mask = cv2.bitwise_not(mask)
70
+ result = cv2.bitwise_and(image, image, mask=mask)
71
+ return result
72
+
73
+ def __repr__(self) -> str:
74
+ return f'HsvColorRemover(for color "{self.name}" with range {self.lower} - {self.upper})'
75
+
76
+ class HsvColorsRemover(PreprocessorProtocol):
77
+ """去除多个指定范围内的 HSV 颜色。"""
78
+ def __init__(
79
+ self,
80
+ colors: list[tuple[tuple[int, int, int], tuple[int, int, int]]],
81
+ *,
82
+ name: str | None = None,
83
+ ):
84
+ self.colors = colors
85
+ self.name = name
86
+ self.__preprocessors = [
87
+ HsvColorRemover(color[0], color[1], name=name) for color in colors
88
+ ]
89
+
90
+ def process(self, image: MatLike, *, format: ImageFormat = 'bgr') -> MatLike:
91
+ if format == 'bgr':
92
+ hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
93
+ elif format == 'hsv':
94
+ hsv = image
95
+ else:
96
+ raise ValueError(f'Invalid format: {format}')
97
+
98
+ for p in self.__preprocessors:
99
+ hsv = p.process(hsv, format='hsv')
100
+ return hsv
101
+
102
+ def __repr__(self) -> str:
103
+ return f'HsvColorsRemover(for colors {self.colors})'
@@ -1,10 +1,10 @@
1
- from .device import Device
2
- from .registration import DeviceImpl
3
-
4
- # 确保所有实现都被注册
5
- from . import implements # noqa: F401
6
-
7
- __all__ = [
8
- 'Device',
9
- 'DeviceImpl',
1
+ from .device import Device
2
+ from .registration import DeviceImpl
3
+
4
+ # 确保所有实现都被注册
5
+ from . import implements # noqa: F401
6
+
7
+ __all__ = [
8
+ 'Device',
9
+ 'DeviceImpl',
10
10
  ]