MaaFw 2.0.3__py3-none-macosx_13_0_x86_64.whl → 5.4.1__py3-none-macosx_13_0_x86_64.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.

Potentially problematic release.


This version of MaaFw might be problematic. Click here for more details.

maa/__init__.py CHANGED
@@ -1,10 +1,12 @@
1
1
  import os
2
+ from pathlib import Path
2
3
 
3
4
  from .library import Library
4
5
 
5
- __PATH = os.path.join(os.path.dirname(__file__), "bin")
6
+ env_path = os.environ.get("MAAFW_BINARY_PATH")
7
+ if env_path:
8
+ __PATH = Path(env_path)
9
+ else:
10
+ __PATH = Path(Path(__file__).parent, "bin")
6
11
 
7
- if os.path.exists(__PATH):
8
- ver = Library.open(__PATH)
9
- if ver:
10
- print(f"MaaFw version: {ver}")
12
+ Library.open(__PATH, agent_server=False)
maa/agent/__init__.py ADDED
@@ -0,0 +1,12 @@
1
+ import os
2
+ from pathlib import Path
3
+
4
+ from ..library import Library
5
+
6
+ env_path = os.environ.get("MAAFW_BINARY_PATH")
7
+ if env_path:
8
+ __PATH = Path(env_path)
9
+ else:
10
+ __PATH = Path(Path(__file__).parent.parent, "bin")
11
+
12
+ Library.open(__PATH, agent_server=True)
@@ -0,0 +1,350 @@
1
+ import ctypes
2
+
3
+ from ..define import *
4
+ from ..library import Library
5
+ from ..event_sink import EventSink
6
+
7
+
8
+ class AgentServer:
9
+ """Agent 服务端 / Agent server
10
+
11
+ 用于在独立进程中托管自定义识别器和动作,与 AgentClient 配合使用。
12
+ 这允许将复杂的自定义逻辑与主程序分离运行。
13
+ Used to host custom recognitions and actions in a separate process, working with AgentClient.
14
+ This allows separating complex custom logic from the main program.
15
+
16
+ Example:
17
+ @AgentServer.custom_recognition("MyReco")
18
+ class MyRecognition(CustomRecognition):
19
+ def analyze(self, context, argv):
20
+ return (100, 100, 50, 50)
21
+
22
+ AgentServer.start_up(sock_id)
23
+ AgentServer.join()
24
+ """
25
+
26
+ @staticmethod
27
+ def custom_recognition(name: str):
28
+ """自定义识别器装饰器 / Custom recognition decorator
29
+
30
+ Args:
31
+ name: 识别器名称,需与 Pipeline 中的 custom_recognition 字段匹配 / Recognition name, should match the custom_recognition field in Pipeline
32
+
33
+ Returns:
34
+ 装饰器函数 / Decorator function
35
+ """
36
+
37
+ def wrapper_recognition(recognition):
38
+ AgentServer.register_custom_recognition(
39
+ name=name, recognition=recognition()
40
+ )
41
+ return recognition
42
+
43
+ return wrapper_recognition
44
+
45
+ _custom_recognition_holder = {}
46
+
47
+ @staticmethod
48
+ def register_custom_recognition(
49
+ name: str, recognition: "CustomRecognition" # type: ignore
50
+ ) -> bool:
51
+ """注册自定义识别器 / Register custom recognition
52
+
53
+ Args:
54
+ name: 识别器名称 / Recognition name
55
+ recognition: 自定义识别器实例 / Custom recognition instance
56
+
57
+ Returns:
58
+ bool: 是否成功 / Whether successful
59
+ """
60
+
61
+ AgentServer._set_api_properties()
62
+
63
+ # avoid gc
64
+ AgentServer._custom_recognition_holder[name] = recognition
65
+
66
+ return bool(
67
+ Library.agent_server().MaaAgentServerRegisterCustomRecognition(
68
+ name.encode(),
69
+ recognition.c_handle,
70
+ recognition.c_arg,
71
+ )
72
+ )
73
+
74
+ @staticmethod
75
+ def custom_action(name: str):
76
+ """自定义动作装饰器 / Custom action decorator
77
+
78
+ Args:
79
+ name: 动作名称,需与 Pipeline 中的 custom_action 字段匹配 / Action name, should match the custom_action field in Pipeline
80
+
81
+ Returns:
82
+ 装饰器函数 / Decorator function
83
+ """
84
+
85
+ def wrapper_action(action):
86
+ AgentServer.register_custom_action(name=name, action=action())
87
+ return action
88
+
89
+ return wrapper_action
90
+
91
+ _custom_action_holder = {}
92
+
93
+ @staticmethod
94
+ def register_custom_action(name: str, action: "CustomAction") -> bool: # type: ignore
95
+ """注册自定义动作 / Register custom action
96
+
97
+ Args:
98
+ name: 动作名称 / Action name
99
+ action: 自定义动作实例 / Custom action instance
100
+
101
+ Returns:
102
+ bool: 是否成功 / Whether successful
103
+ """
104
+
105
+ AgentServer._set_api_properties()
106
+
107
+ # avoid gc
108
+ AgentServer._custom_action_holder[name] = action
109
+
110
+ return bool(
111
+ Library.agent_server().MaaAgentServerRegisterCustomAction(
112
+ name.encode(),
113
+ action.c_handle,
114
+ action.c_arg,
115
+ )
116
+ )
117
+
118
+ @staticmethod
119
+ def start_up(identifier: str) -> bool:
120
+ """启动 Agent 服务 / Start Agent service
121
+
122
+ Args:
123
+ identifier: 连接标识符,用于与 AgentClient 匹配 / Connection identifier for matching with AgentClient
124
+
125
+ Returns:
126
+ bool: 是否成功 / Whether successful
127
+ """
128
+
129
+ AgentServer._set_api_properties()
130
+
131
+ return bool(Library.agent_server().MaaAgentServerStartUp(identifier.encode()))
132
+
133
+ @staticmethod
134
+ def shut_down() -> None:
135
+ """关闭 Agent 服务 / Shut down Agent service"""
136
+
137
+ AgentServer._set_api_properties()
138
+
139
+ Library.agent_server().MaaAgentServerShutDown()
140
+
141
+ @staticmethod
142
+ def join() -> None:
143
+ """等待 Agent 服务结束 / Wait for Agent service to end
144
+
145
+ 阻塞当前线程直到服务结束。
146
+ Blocks the current thread until the service ends.
147
+ """
148
+
149
+ AgentServer._set_api_properties()
150
+
151
+ Library.agent_server().MaaAgentServerJoin()
152
+
153
+ @staticmethod
154
+ def detach() -> None:
155
+ """分离 Agent 服务 / Detach Agent service
156
+
157
+ 允许服务在后台运行而不阻塞。
158
+ Allows the service to run in the background without blocking.
159
+ """
160
+
161
+ AgentServer._set_api_properties()
162
+
163
+ Library.agent_server().MaaAgentServerDetach()
164
+
165
+ _sink_holder: Dict[int, "EventSink"] = {}
166
+
167
+ @staticmethod
168
+ def resource_sink():
169
+ """资源事件监听器装饰器 / Resource event sink decorator
170
+
171
+ Returns:
172
+ 装饰器函数 / Decorator function
173
+ """
174
+
175
+ def wrapper_sink(sink):
176
+ AgentServer.add_resource_sink(sink=sink())
177
+ return sink
178
+
179
+ return wrapper_sink
180
+
181
+ @staticmethod
182
+ def add_resource_sink(sink: "ResourceEventSink") -> None:
183
+ """添加资源事件监听器 / Add resource event sink
184
+
185
+ Args:
186
+ sink: 资源事件监听器 / Resource event sink
187
+ """
188
+ sink_id = int(
189
+ Library.agent_server().MaaAgentServerAddResourceSink(
190
+ *EventSink._gen_c_param(sink)
191
+ )
192
+ )
193
+ if sink_id == MaaInvalidId:
194
+ return None
195
+
196
+ AgentServer._sink_holder[sink_id] = sink
197
+
198
+ @staticmethod
199
+ def controller_sink():
200
+ """控制器事件监听器装饰器 / Controller event sink decorator
201
+
202
+ Returns:
203
+ 装饰器函数 / Decorator function
204
+ """
205
+
206
+ def wrapper_sink(sink):
207
+ AgentServer.add_controller_sink(sink=sink())
208
+ return sink
209
+
210
+ return wrapper_sink
211
+
212
+ @staticmethod
213
+ def add_controller_sink(sink: "ControllerEventSink") -> None:
214
+ """添加控制器事件监听器 / Add controller event sink
215
+
216
+ Args:
217
+ sink: 控制器事件监听器 / Controller event sink
218
+ """
219
+ sink_id = int(
220
+ Library.agent_server().MaaAgentServerAddControllerSink(
221
+ *EventSink._gen_c_param(sink)
222
+ )
223
+ )
224
+ if sink_id == MaaInvalidId:
225
+ return None
226
+
227
+ AgentServer._sink_holder[sink_id] = sink
228
+
229
+ @staticmethod
230
+ def tasker_sink():
231
+ """任务器事件监听器装饰器 / Tasker event sink decorator
232
+
233
+ Returns:
234
+ 装饰器函数 / Decorator function
235
+ """
236
+
237
+ def wrapper_sink(sink):
238
+ AgentServer.add_tasker_sink(sink=sink())
239
+ return sink
240
+
241
+ return wrapper_sink
242
+
243
+ @staticmethod
244
+ def add_tasker_sink(sink: "TaskerEventSink") -> None:
245
+ """添加任务器事件监听器 / Add tasker event sink
246
+
247
+ Args:
248
+ sink: 任务器事件监听器 / Tasker event sink
249
+ """
250
+ sink_id = int(
251
+ Library.agent_server().MaaAgentServerAddTaskerSink(
252
+ *EventSink._gen_c_param(sink)
253
+ )
254
+ )
255
+ if sink_id == MaaInvalidId:
256
+ return None
257
+
258
+ AgentServer._sink_holder[sink_id] = sink
259
+
260
+ @staticmethod
261
+ def context_sink():
262
+ """上下文事件监听器装饰器 / Context event sink decorator
263
+
264
+ Returns:
265
+ 装饰器函数 / Decorator function
266
+ """
267
+
268
+ def wrapper_sink(sink):
269
+ AgentServer.add_context_sink(sink=sink())
270
+ return sink
271
+
272
+ return wrapper_sink
273
+
274
+ @staticmethod
275
+ def add_context_sink(sink: "ContextEventSink") -> None:
276
+ """添加上下文事件监听器 / Add context event sink
277
+
278
+ Args:
279
+ sink: 上下文事件监听器 / Context event sink
280
+ """
281
+ sink_id = int(
282
+ Library.agent_server().MaaAgentServerAddContextSink(
283
+ *EventSink._gen_c_param(sink)
284
+ )
285
+ )
286
+ if sink_id == MaaInvalidId:
287
+ return None
288
+
289
+ AgentServer._sink_holder[sink_id] = sink
290
+
291
+ _api_properties_initialized: bool = False
292
+
293
+ @staticmethod
294
+ def _set_api_properties():
295
+ if AgentServer._api_properties_initialized:
296
+ return
297
+
298
+ AgentServer._api_properties_initialized = True
299
+
300
+ Library.agent_server().MaaAgentServerRegisterCustomRecognition.restype = MaaBool
301
+ Library.agent_server().MaaAgentServerRegisterCustomRecognition.argtypes = [
302
+ ctypes.c_char_p,
303
+ MaaCustomRecognitionCallback,
304
+ ctypes.c_void_p,
305
+ ]
306
+
307
+ Library.agent_server().MaaAgentServerRegisterCustomAction.restype = MaaBool
308
+ Library.agent_server().MaaAgentServerRegisterCustomAction.argtypes = [
309
+ ctypes.c_char_p,
310
+ MaaCustomActionCallback,
311
+ ctypes.c_void_p,
312
+ ]
313
+
314
+ Library.agent_server().MaaAgentServerStartUp.restype = MaaBool
315
+ Library.agent_server().MaaAgentServerStartUp.argtypes = [
316
+ ctypes.c_char_p,
317
+ ]
318
+
319
+ Library.agent_server().MaaAgentServerShutDown.restype = None
320
+ Library.agent_server().MaaAgentServerShutDown.argtypes = []
321
+
322
+ Library.agent_server().MaaAgentServerJoin.restype = None
323
+ Library.agent_server().MaaAgentServerJoin.argtypes = []
324
+
325
+ Library.agent_server().MaaAgentServerDetach.restype = None
326
+ Library.agent_server().MaaAgentServerDetach.argtypes = []
327
+
328
+ Library.agent_server().MaaAgentServerAddResourceSink.restype = MaaSinkId
329
+ Library.agent_server().MaaAgentServerAddResourceSink.argtypes = [
330
+ MaaEventCallback,
331
+ ctypes.c_void_p,
332
+ ]
333
+
334
+ Library.agent_server().MaaAgentServerAddControllerSink.restype = MaaSinkId
335
+ Library.agent_server().MaaAgentServerAddControllerSink.argtypes = [
336
+ MaaEventCallback,
337
+ ctypes.c_void_p,
338
+ ]
339
+
340
+ Library.agent_server().MaaAgentServerAddTaskerSink.restype = MaaSinkId
341
+ Library.agent_server().MaaAgentServerAddTaskerSink.argtypes = [
342
+ MaaEventCallback,
343
+ ctypes.c_void_p,
344
+ ]
345
+
346
+ Library.agent_server().MaaAgentServerAddContextSink.restype = MaaSinkId
347
+ Library.agent_server().MaaAgentServerAddContextSink.argtypes = [
348
+ MaaEventCallback,
349
+ ctypes.c_void_p,
350
+ ]
maa/agent_client.py ADDED
@@ -0,0 +1,291 @@
1
+ import ctypes
2
+ from typing import List
3
+
4
+ from .define import *
5
+ from .library import Library
6
+ from .resource import Resource
7
+ from .controller import Controller
8
+ from .tasker import Tasker
9
+ from .buffer import StringBuffer, StringListBuffer
10
+
11
+
12
+ class AgentClient:
13
+ """Agent 客户端 / Agent client
14
+
15
+ 用于连接到 AgentServer,将自定义识别器和动作的执行委托给独立进程。
16
+ 这允许将 MaaFW 本体与 Custom 逻辑分离至独立进程运行。
17
+ Used to connect to AgentServer, delegating custom recognition and action execution to a separate process.
18
+ This allows separating MaaFW core from Custom logic into independent processes.
19
+ """
20
+
21
+ _handle: MaaAgentClientHandle
22
+
23
+ def __init__(self, identifier: Optional[str] = None):
24
+ """创建 Agent 客户端 / Create Agent client
25
+
26
+ Args:
27
+ identifier: 可选的连接标识符,用于匹配特定的 AgentServer / Optional connection identifier for matching specific AgentServer
28
+
29
+ Raises:
30
+ RuntimeError: 如果创建失败
31
+ """
32
+ self._set_api_properties()
33
+
34
+ if identifier:
35
+ id_buffer = StringBuffer()
36
+ id_buffer.set(identifier)
37
+ id_buffer_handle = id_buffer._handle
38
+ else:
39
+ id_buffer_handle = None
40
+
41
+ self._handle = Library.agent_client().MaaAgentClientCreateV2(id_buffer_handle)
42
+ if not self._handle:
43
+ raise RuntimeError("Failed to create agent client.")
44
+
45
+ def __del__(self):
46
+ if self._handle:
47
+ Library.agent_client().MaaAgentClientDestroy(self._handle)
48
+
49
+ @property
50
+ def identifier(self) -> Optional[str]:
51
+ """获取连接标识符 / Get connection identifier
52
+
53
+ Returns:
54
+ Optional[str]: 连接标识符,如果未设置则返回 None / Connection identifier, or None if not set
55
+ """
56
+ id_buffer = StringBuffer()
57
+ if not Library.agent_client().MaaAgentClientIdentifier(
58
+ self._handle, id_buffer._handle
59
+ ):
60
+ return None
61
+
62
+ return id_buffer.get()
63
+
64
+ def bind(self, resource: Resource) -> bool:
65
+ """绑定资源 / Bind resource
66
+
67
+ 将 AgentServer 中注册的自定义识别器和动作绑定到资源上。
68
+ Bind custom recognitions and actions registered in AgentServer to the resource.
69
+
70
+ Args:
71
+ resource: 资源对象 / Resource object
72
+
73
+ Returns:
74
+ bool: 是否成功 / Whether successful
75
+ """
76
+ # avoid gc
77
+ self._resource = resource
78
+
79
+ return bool(
80
+ Library.agent_client().MaaAgentClientBindResource(
81
+ self._handle, resource._handle
82
+ )
83
+ )
84
+
85
+ def register_sink(
86
+ self, resource: Resource, controller: Controller, tasker: Tasker
87
+ ) -> bool:
88
+ """注册事件监听器 / Register event sinks
89
+
90
+ 将资源、控制器、任务器的事件转发给 AgentServer。
91
+ Forward resource, controller, and tasker events to AgentServer.
92
+
93
+ Args:
94
+ resource: 资源对象 / Resource object
95
+ controller: 控制器对象 / Controller object
96
+ tasker: 任务器对象 / Tasker object
97
+
98
+ Returns:
99
+ bool: 是否全部注册成功 / Whether all registrations succeeded
100
+ """
101
+ # avoid gc
102
+ self._sinks = [resource, controller, tasker]
103
+
104
+ return (
105
+ bool(
106
+ Library.agent_client().MaaAgentClientRegisterResourceSink(
107
+ self._handle, resource._handle
108
+ )
109
+ )
110
+ and bool(
111
+ Library.agent_client().MaaAgentClientRegisterControllerSink(
112
+ self._handle, controller._handle
113
+ )
114
+ )
115
+ and bool(
116
+ Library.agent_client().MaaAgentClientRegisterTaskerSink(
117
+ self._handle, tasker._handle
118
+ )
119
+ )
120
+ )
121
+
122
+ def connect(self) -> bool:
123
+ """连接到 AgentServer / Connect to AgentServer
124
+
125
+ Returns:
126
+ bool: 是否成功 / Whether successful
127
+ """
128
+ return bool(Library.agent_client().MaaAgentClientConnect(self._handle))
129
+
130
+ def disconnect(self) -> bool:
131
+ """断开与 AgentServer 的连接 / Disconnect from AgentServer
132
+
133
+ Returns:
134
+ bool: 是否成功 / Whether successful
135
+ """
136
+ return bool(Library.agent_client().MaaAgentClientDisconnect(self._handle))
137
+
138
+ @property
139
+ def connected(self) -> bool:
140
+ """判断是否已连接 / Check if connected
141
+
142
+ Returns:
143
+ bool: 是否已连接 / Whether connected
144
+ """
145
+ return bool(Library.agent_client().MaaAgentClientConnected(self._handle))
146
+
147
+ @property
148
+ def alive(self) -> bool:
149
+ """判断连接是否存活 / Check if connection is alive
150
+
151
+ Returns:
152
+ bool: 连接是否存活 / Whether connection is alive
153
+ """
154
+ return bool(Library.agent_client().MaaAgentClientAlive(self._handle))
155
+
156
+ def set_timeout(self, milliseconds: int) -> bool:
157
+ """设置超时时间 / Set timeout
158
+
159
+ Args:
160
+ milliseconds: 超时时间(毫秒) / Timeout in milliseconds
161
+
162
+ Returns:
163
+ bool: 是否成功 / Whether successful
164
+ """
165
+ return bool(
166
+ Library.agent_client().MaaAgentClientSetTimeout(
167
+ self._handle, ctypes.c_int64(milliseconds)
168
+ )
169
+ )
170
+
171
+ @property
172
+ def custom_recognition_list(self) -> List[str]:
173
+ """获取已注册的自定义识别器列表 / Get registered custom recognizer list
174
+
175
+ Returns:
176
+ list[str]: 自定义识别器名列表 / List of custom recognizer names
177
+
178
+ Raises:
179
+ RuntimeError: 如果获取失败
180
+ """
181
+ buffer = StringListBuffer()
182
+ if not Library.agent_client().MaaAgentClientGetCustomRecognitionList(
183
+ self._handle, buffer._handle
184
+ ):
185
+ raise RuntimeError("Failed to get custom recognition list.")
186
+ return buffer.get()
187
+
188
+ @property
189
+ def custom_action_list(self) -> List[str]:
190
+ """获取已注册的自定义操作列表 / Get registered custom action list
191
+
192
+ Returns:
193
+ list[str]: 自定义操作名列表 / List of custom action names
194
+
195
+ Raises:
196
+ RuntimeError: 如果获取失败
197
+ """
198
+ buffer = StringListBuffer()
199
+ if not Library.agent_client().MaaAgentClientGetCustomActionList(
200
+ self._handle, buffer._handle
201
+ ):
202
+ raise RuntimeError("Failed to get custom action list.")
203
+ return buffer.get()
204
+
205
+ _api_properties_initialized: bool = False
206
+
207
+ @staticmethod
208
+ def _set_api_properties():
209
+ if AgentClient._api_properties_initialized:
210
+ return
211
+
212
+ if Library.is_agent_server():
213
+ raise RuntimeError("AgentClient is not available in AgentServer.")
214
+
215
+ AgentClient._api_properties_initialized = True
216
+
217
+ Library.agent_client().MaaAgentClientCreateV2.restype = MaaAgentClientHandle
218
+ Library.agent_client().MaaAgentClientCreateV2.argtypes = [
219
+ MaaStringBufferHandle,
220
+ ]
221
+
222
+ Library.agent_client().MaaAgentClientIdentifier.restype = MaaBool
223
+ Library.agent_client().MaaAgentClientIdentifier.argtypes = [
224
+ MaaAgentClientHandle,
225
+ MaaStringBufferHandle,
226
+ ]
227
+
228
+ Library.agent_client().MaaAgentClientDestroy.restype = None
229
+ Library.agent_client().MaaAgentClientDestroy.argtypes = [MaaAgentClientHandle]
230
+
231
+ Library.agent_client().MaaAgentClientBindResource.restype = MaaBool
232
+ Library.agent_client().MaaAgentClientBindResource.argtypes = [
233
+ MaaAgentClientHandle,
234
+ MaaResourceHandle,
235
+ ]
236
+
237
+ Library.agent_client().MaaAgentClientRegisterResourceSink.restype = MaaBool
238
+ Library.agent_client().MaaAgentClientRegisterResourceSink.argtypes = [
239
+ MaaAgentClientHandle,
240
+ MaaResourceHandle,
241
+ ]
242
+
243
+ Library.agent_client().MaaAgentClientRegisterControllerSink.restype = MaaBool
244
+ Library.agent_client().MaaAgentClientRegisterControllerSink.argtypes = [
245
+ MaaAgentClientHandle,
246
+ MaaControllerHandle,
247
+ ]
248
+
249
+ Library.agent_client().MaaAgentClientRegisterTaskerSink.restype = MaaBool
250
+ Library.agent_client().MaaAgentClientRegisterTaskerSink.argtypes = [
251
+ MaaAgentClientHandle,
252
+ MaaTaskerHandle,
253
+ ]
254
+
255
+ Library.agent_client().MaaAgentClientConnect.restype = MaaBool
256
+ Library.agent_client().MaaAgentClientConnect.argtypes = [
257
+ MaaAgentClientHandle,
258
+ ]
259
+
260
+ Library.agent_client().MaaAgentClientDisconnect.restype = MaaBool
261
+ Library.agent_client().MaaAgentClientDisconnect.argtypes = [
262
+ MaaAgentClientHandle,
263
+ ]
264
+
265
+ Library.agent_client().MaaAgentClientConnected.restype = MaaBool
266
+ Library.agent_client().MaaAgentClientConnected.argtypes = [
267
+ MaaAgentClientHandle,
268
+ ]
269
+
270
+ Library.agent_client().MaaAgentClientAlive.restype = MaaBool
271
+ Library.agent_client().MaaAgentClientAlive.argtypes = [
272
+ MaaAgentClientHandle,
273
+ ]
274
+
275
+ Library.agent_client().MaaAgentClientSetTimeout.restype = MaaBool
276
+ Library.agent_client().MaaAgentClientSetTimeout.argtypes = [
277
+ MaaAgentClientHandle,
278
+ ctypes.c_int64,
279
+ ]
280
+
281
+ Library.agent_client().MaaAgentClientGetCustomRecognitionList.restype = MaaBool
282
+ Library.agent_client().MaaAgentClientGetCustomRecognitionList.argtypes = [
283
+ MaaAgentClientHandle,
284
+ MaaStringListBufferHandle,
285
+ ]
286
+
287
+ Library.agent_client().MaaAgentClientGetCustomActionList.restype = MaaBool
288
+ Library.agent_client().MaaAgentClientGetCustomActionList.argtypes = [
289
+ MaaAgentClientHandle,
290
+ MaaStringListBufferHandle,
291
+ ]
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
maa/bin/libMaaUtils.dylib CHANGED
Binary file
Binary file
Binary file