kotonebot 0.5.0__py3-none-any.whl → 0.7.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 (107) 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 +73 -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/__init__.py +1 -0
  36. kotonebot/client/implements/windows/print_window.py +133 -0
  37. kotonebot/client/implements/windows/send_message.py +324 -0
  38. kotonebot/client/implements/{windows.py → windows/windows.py} +175 -176
  39. kotonebot/client/protocol.py +69 -69
  40. kotonebot/client/registration.py +24 -24
  41. kotonebot/client/scaler.py +467 -0
  42. kotonebot/config/base_config.py +103 -96
  43. kotonebot/config/config.py +61 -0
  44. kotonebot/config/manager.py +36 -36
  45. kotonebot/core/__init__.py +13 -0
  46. kotonebot/core/entities/base.py +182 -0
  47. kotonebot/core/entities/compound.py +75 -0
  48. kotonebot/core/entities/ocr.py +117 -0
  49. kotonebot/core/entities/template_match.py +198 -0
  50. kotonebot/devtools/__init__.py +42 -0
  51. kotonebot/devtools/cli/__init__.py +6 -0
  52. kotonebot/devtools/cli/main.py +53 -0
  53. kotonebot/{tools → devtools}/mirror.py +354 -354
  54. kotonebot/devtools/project/project.py +41 -0
  55. kotonebot/devtools/project/scanner.py +202 -0
  56. kotonebot/devtools/project/schema.py +99 -0
  57. kotonebot/devtools/resgen/__init__.py +42 -0
  58. kotonebot/devtools/resgen/codegen.py +331 -0
  59. kotonebot/devtools/resgen/core.py +94 -0
  60. kotonebot/devtools/resgen/parsers.py +360 -0
  61. kotonebot/devtools/resgen/utils.py +158 -0
  62. kotonebot/devtools/resgen/validation.py +115 -0
  63. kotonebot/devtools/web/dist/assets/bootstrap-icons-BOrJxbIo.woff +0 -0
  64. kotonebot/devtools/web/dist/assets/bootstrap-icons-BtvjY1KL.woff2 +0 -0
  65. kotonebot/devtools/web/dist/assets/ext-language_tools-CD021WJ2.js +2577 -0
  66. kotonebot/devtools/web/dist/assets/index-B_m5f2LF.js +2836 -0
  67. kotonebot/devtools/web/dist/assets/index-BlEDyGGa.css +9 -0
  68. kotonebot/devtools/web/dist/assets/language-client-C9muzqaq.js +128 -0
  69. kotonebot/devtools/web/dist/assets/mode-python-CtHp76XS.js +476 -0
  70. kotonebot/devtools/web/dist/icons/symbol-class.svg +3 -0
  71. kotonebot/devtools/web/dist/icons/symbol-file.svg +3 -0
  72. kotonebot/devtools/web/dist/icons/symbol-method.svg +3 -0
  73. kotonebot/devtools/web/dist/index.html +25 -0
  74. kotonebot/devtools/web/server/__init__.py +0 -0
  75. kotonebot/devtools/web/server/rest_api.py +217 -0
  76. kotonebot/devtools/web/server/server.py +85 -0
  77. kotonebot/errors.py +76 -76
  78. kotonebot/interop/win/__init__.py +13 -9
  79. kotonebot/interop/win/_mouse.py +310 -310
  80. kotonebot/interop/win/message_box.py +313 -313
  81. kotonebot/interop/win/reg.py +37 -37
  82. kotonebot/interop/win/shake_mouse.py +224 -0
  83. kotonebot/interop/win/shortcut.py +43 -43
  84. kotonebot/interop/win/task_dialog.py +513 -513
  85. kotonebot/interop/win/window.py +89 -0
  86. kotonebot/logging/__init__.py +2 -2
  87. kotonebot/logging/log.py +17 -17
  88. kotonebot/primitives/__init__.py +19 -17
  89. kotonebot/primitives/geometry.py +1067 -862
  90. kotonebot/primitives/visual.py +143 -63
  91. kotonebot/ui/file_host/sensio.py +36 -36
  92. kotonebot/ui/file_host/tmp_send.py +54 -54
  93. kotonebot/ui/pushkit/__init__.py +3 -3
  94. kotonebot/ui/pushkit/image_host.py +88 -88
  95. kotonebot/ui/pushkit/protocol.py +13 -13
  96. kotonebot/ui/pushkit/wxpusher.py +54 -54
  97. kotonebot/ui/user.py +148 -148
  98. kotonebot/util.py +436 -436
  99. {kotonebot-0.5.0.dist-info → kotonebot-0.7.0.dist-info}/METADATA +84 -82
  100. kotonebot-0.7.0.dist-info/RECORD +109 -0
  101. {kotonebot-0.5.0.dist-info → kotonebot-0.7.0.dist-info}/WHEEL +1 -1
  102. kotonebot-0.7.0.dist-info/entry_points.txt +2 -0
  103. {kotonebot-0.5.0.dist-info → kotonebot-0.7.0.dist-info}/licenses/LICENSE +673 -673
  104. kotonebot/client/implements/adb_raw.py +0 -163
  105. kotonebot-0.5.0.dist-info/RECORD +0 -71
  106. /kotonebot/{tools → devtools/project}/__init__.py +0 -0
  107. {kotonebot-0.5.0.dist-info → kotonebot-0.7.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,89 @@
1
+ from typing import Literal
2
+ from typing_extensions import assert_never
3
+
4
+ import win32gui
5
+ import win32con
6
+ import win32api
7
+
8
+ from kotonebot.primitives import Rect
9
+
10
+ FindWindowMethod = Literal['title']
11
+
12
+ class Win32Window:
13
+ def __init__(self, hwnd: int) -> None:
14
+ self.hwnd = hwnd
15
+
16
+ @staticmethod
17
+ def find_window(method: FindWindowMethod, title: str) -> 'Win32Window | None':
18
+ """查找窗口。
19
+
20
+ :param method: 查找依据。
21
+ :param title: 窗口标题
22
+ :return: 若找到窗口则返回 Win32Window 实例,否则返回 None。
23
+ """
24
+ match method:
25
+ case 'title':
26
+ hwnd = win32gui.FindWindow(None, title)
27
+ if hwnd == 0:
28
+ return None
29
+ return Win32Window(hwnd)
30
+ case _:
31
+ assert_never(method)
32
+
33
+ @staticmethod
34
+ def require_window(method: FindWindowMethod, title: str) -> 'Win32Window':
35
+ """查找窗口,未找到则抛出异常。
36
+
37
+ 参数同 :ref:`find_window`。
38
+ """
39
+ window = Win32Window.find_window(method, title)
40
+ if window is None:
41
+ raise RuntimeError(f'Window not found: {title}')
42
+ return window
43
+
44
+ def get_rect(self) -> Rect:
45
+ """取得窗口范围"""
46
+ left, top, right, bottom = win32gui.GetWindowRect(self.hwnd)
47
+ return Rect(left, top, right - left, bottom - top)
48
+
49
+ def get_client_rect(self) -> Rect:
50
+ """取得窗口客户区域范围"""
51
+ left, top, right, bottom = win32gui.GetClientRect(self.hwnd)
52
+ return Rect(left, top, right - left, bottom - top)
53
+
54
+ def is_active(self) -> bool:
55
+ """检查窗口是否为前台窗口"""
56
+ active_hwnd = win32gui.GetForegroundWindow()
57
+ return active_hwnd == self.hwnd
58
+
59
+ def is_minimized(self) -> bool:
60
+ """检查窗口是否最小化"""
61
+ return win32gui.IsIconic(self.hwnd) != 0
62
+
63
+ def restore(self) -> None:
64
+ """还原最小化的窗口"""
65
+ win32gui.ShowWindow(self.hwnd, win32con.SW_RESTORE)
66
+
67
+ def set_position(self, x: int, y: int, *, flags: int | None = None) -> None:
68
+ """
69
+ 设置窗口位置。
70
+
71
+ :param flags: SetWindowPos 的 `flags` 参数。默认参数为 SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE。
72
+ """
73
+ if flags is None:
74
+ flags = win32con.SWP_NOSIZE | win32con.SWP_NOZORDER | win32con.SWP_NOACTIVATE
75
+ win32gui.SetWindowPos(
76
+ self.hwnd, None, x, y, 0, 0,
77
+ flags
78
+ )
79
+
80
+ def bring_foreground(self) -> None:
81
+ """将窗口置于前台"""
82
+ win32gui.SetForegroundWindow(self.hwnd)
83
+
84
+ def send_message(self, msg: int, wparam: int, lparam: int) -> int:
85
+ return win32gui.SendMessage(self.hwnd, msg, wparam, lparam)
86
+
87
+ def post_message(self, msg: int, wparam: int, lparam: int) -> bool:
88
+ win32gui.PostMessage(self.hwnd, msg, wparam, lparam)
89
+ return win32api.GetLastError() == 0
@@ -1,2 +1,2 @@
1
- from logging import DEBUG, INFO, WARNING, ERROR, CRITICAL, basicConfig
2
- from .log import getLogger, enable_verbose, LEVEL_VERBOSE as VERBOSE
1
+ from logging import DEBUG, INFO, WARNING, ERROR, CRITICAL, basicConfig
2
+ from .log import getLogger, enable_verbose, LEVEL_VERBOSE as VERBOSE
kotonebot/logging/log.py CHANGED
@@ -1,18 +1,18 @@
1
- import logging
2
- from typing import cast
3
-
4
- LEVEL_VERBOSE = 5
5
-
6
- def enable_verbose():
7
- logging.addLevelName(LEVEL_VERBOSE, 'VERBOSE')
8
-
9
- class VerboseLogger(logging.Logger):
10
- def verbose(self, msg, *args, **kwargs):
11
- if self.isEnabledFor(LEVEL_VERBOSE):
12
- self._log(LEVEL_VERBOSE, msg, args, **kwargs)
13
-
14
- def getLogger(name: str | None = None) -> VerboseLogger:
15
- logger = logging.getLogger(name)
16
- if not isinstance(logger, VerboseLogger):
17
- logger.__class__ = VerboseLogger
1
+ import logging
2
+ from typing import cast
3
+
4
+ LEVEL_VERBOSE = 5
5
+
6
+ def enable_verbose():
7
+ logging.addLevelName(LEVEL_VERBOSE, 'VERBOSE')
8
+
9
+ class VerboseLogger(logging.Logger):
10
+ def verbose(self, msg, *args, **kwargs):
11
+ if self.isEnabledFor(LEVEL_VERBOSE):
12
+ self._log(LEVEL_VERBOSE, msg, args, **kwargs)
13
+
14
+ def getLogger(name: str | None = None) -> VerboseLogger:
15
+ logger = logging.getLogger(name)
16
+ if not isinstance(logger, VerboseLogger):
17
+ logger.__class__ = VerboseLogger
18
18
  return cast(VerboseLogger, logger)
@@ -1,17 +1,19 @@
1
- from .visual import Image, Template
2
- from .geometry import Point, Rect, Size, Vector2D, Vector3D, is_point, is_rect
3
- from .geometry import RectTuple, PointTuple
4
-
5
- __all__ = [
6
- 'Image',
7
- 'Template',
8
- 'Point',
9
- 'Rect',
10
- 'Size',
11
- 'Vector2D',
12
- 'Vector3D',
13
- 'is_point',
14
- 'is_rect',
15
- 'RectTuple',
16
- 'PointTuple'
17
- ]
1
+ from .visual import Image, Template, ImageSlice
2
+ from .geometry import Point, Rect, Size, Vector2D, Vector3D, is_point, is_rect
3
+ from .geometry import RectTuple, PointTuple
4
+
5
+ __all__ = [
6
+ 'Image',
7
+ 'Template',
8
+ 'ImageSlice',
9
+
10
+ 'Point',
11
+ 'Rect',
12
+ 'Size',
13
+ 'Vector2D',
14
+ 'Vector3D',
15
+ 'is_point',
16
+ 'is_rect',
17
+ 'RectTuple',
18
+ 'PointTuple'
19
+ ]