kotonebot 0.5.0__py3-none-any.whl → 0.6.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 (103) hide show
  1. kotonebot/__init__.py +39 -39
  2. kotonebot/backend/bot.py +312 -312
  3. kotonebot/backend/color.py +525 -525
  4. kotonebot/backend/context/__init__.py +3 -3
  5. kotonebot/backend/context/context.py +1002 -1002
  6. kotonebot/backend/context/task_action.py +183 -183
  7. kotonebot/backend/core.py +86 -129
  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/image.py +36 -5
  15. kotonebot/backend/loop.py +222 -208
  16. kotonebot/backend/ocr.py +535 -535
  17. kotonebot/backend/preprocessor.py +103 -103
  18. kotonebot/client/__init__.py +9 -9
  19. kotonebot/client/device.py +369 -529
  20. kotonebot/client/fast_screenshot.py +377 -377
  21. kotonebot/client/host/__init__.py +43 -43
  22. kotonebot/client/host/adb_common.py +101 -107
  23. kotonebot/client/host/custom.py +118 -118
  24. kotonebot/client/host/leidian_host.py +196 -196
  25. kotonebot/client/host/mumu12_host.py +353 -353
  26. kotonebot/client/host/protocol.py +214 -214
  27. kotonebot/client/host/windows_common.py +58 -58
  28. kotonebot/client/implements/__init__.py +65 -70
  29. kotonebot/client/implements/adb.py +89 -89
  30. kotonebot/client/implements/nemu_ipc/__init__.py +11 -11
  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 -188
  34. kotonebot/client/implements/uiautomator2.py +85 -85
  35. kotonebot/client/implements/windows.py +176 -176
  36. kotonebot/client/protocol.py +69 -69
  37. kotonebot/client/registration.py +24 -24
  38. kotonebot/client/scaler.py +467 -0
  39. kotonebot/config/base_config.py +96 -96
  40. kotonebot/config/config.py +61 -0
  41. kotonebot/config/manager.py +36 -36
  42. kotonebot/core/__init__.py +13 -0
  43. kotonebot/core/entities/base.py +182 -0
  44. kotonebot/core/entities/compound.py +75 -0
  45. kotonebot/core/entities/ocr.py +117 -0
  46. kotonebot/core/entities/template_match.py +198 -0
  47. kotonebot/devtools/__init__.py +42 -0
  48. kotonebot/devtools/cli/__init__.py +6 -0
  49. kotonebot/devtools/cli/main.py +53 -0
  50. kotonebot/{tools → devtools}/mirror.py +354 -354
  51. kotonebot/devtools/project/project.py +41 -0
  52. kotonebot/devtools/project/scanner.py +202 -0
  53. kotonebot/devtools/project/schema.py +99 -0
  54. kotonebot/devtools/resgen/__init__.py +42 -0
  55. kotonebot/devtools/resgen/codegen.py +331 -0
  56. kotonebot/devtools/resgen/core.py +94 -0
  57. kotonebot/devtools/resgen/parsers.py +360 -0
  58. kotonebot/devtools/resgen/utils.py +158 -0
  59. kotonebot/devtools/resgen/validation.py +115 -0
  60. kotonebot/devtools/web/dist/assets/bootstrap-icons-BOrJxbIo.woff +0 -0
  61. kotonebot/devtools/web/dist/assets/bootstrap-icons-BtvjY1KL.woff2 +0 -0
  62. kotonebot/devtools/web/dist/assets/ext-language_tools-CD021WJ2.js +2577 -0
  63. kotonebot/devtools/web/dist/assets/index-B_m5f2LF.js +2836 -0
  64. kotonebot/devtools/web/dist/assets/index-BlEDyGGa.css +9 -0
  65. kotonebot/devtools/web/dist/assets/language-client-C9muzqaq.js +128 -0
  66. kotonebot/devtools/web/dist/assets/mode-python-CtHp76XS.js +476 -0
  67. kotonebot/devtools/web/dist/icons/symbol-class.svg +3 -0
  68. kotonebot/devtools/web/dist/icons/symbol-file.svg +3 -0
  69. kotonebot/devtools/web/dist/icons/symbol-method.svg +3 -0
  70. kotonebot/devtools/web/dist/index.html +25 -0
  71. kotonebot/devtools/web/server/__init__.py +0 -0
  72. kotonebot/devtools/web/server/rest_api.py +217 -0
  73. kotonebot/devtools/web/server/server.py +85 -0
  74. kotonebot/errors.py +76 -76
  75. kotonebot/interop/win/__init__.py +11 -9
  76. kotonebot/interop/win/_mouse.py +310 -310
  77. kotonebot/interop/win/message_box.py +313 -313
  78. kotonebot/interop/win/reg.py +37 -37
  79. kotonebot/interop/win/shake_mouse.py +224 -0
  80. kotonebot/interop/win/shortcut.py +43 -43
  81. kotonebot/interop/win/task_dialog.py +513 -513
  82. kotonebot/logging/__init__.py +2 -2
  83. kotonebot/logging/log.py +17 -17
  84. kotonebot/primitives/__init__.py +19 -17
  85. kotonebot/primitives/geometry.py +1067 -862
  86. kotonebot/primitives/visual.py +143 -63
  87. kotonebot/ui/file_host/sensio.py +36 -36
  88. kotonebot/ui/file_host/tmp_send.py +54 -54
  89. kotonebot/ui/pushkit/__init__.py +3 -3
  90. kotonebot/ui/pushkit/image_host.py +88 -88
  91. kotonebot/ui/pushkit/protocol.py +13 -13
  92. kotonebot/ui/pushkit/wxpusher.py +54 -54
  93. kotonebot/ui/user.py +148 -148
  94. kotonebot/util.py +436 -436
  95. {kotonebot-0.5.0.dist-info → kotonebot-0.6.0.dist-info}/METADATA +84 -82
  96. kotonebot-0.6.0.dist-info/RECORD +105 -0
  97. kotonebot-0.6.0.dist-info/entry_points.txt +2 -0
  98. {kotonebot-0.5.0.dist-info → kotonebot-0.6.0.dist-info}/licenses/LICENSE +673 -673
  99. kotonebot/client/implements/adb_raw.py +0 -163
  100. kotonebot-0.5.0.dist-info/RECORD +0 -71
  101. /kotonebot/{tools → devtools/project}/__init__.py +0 -0
  102. {kotonebot-0.5.0.dist-info → kotonebot-0.6.0.dist-info}/WHEEL +0 -0
  103. {kotonebot-0.5.0.dist-info → kotonebot-0.6.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
  ]