Skip to content

Commit dd7d9bd

Browse files
committed
refactor:适配maafw5.0 sink
1 parent 04252ba commit dd7d9bd

File tree

5 files changed

+116
-62
lines changed

5 files changed

+116
-62
lines changed

app/utils/maa_sink.py

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
from maa.controller import ControllerEventSink, Controller, NotificationType
2+
from maa.resource import ResourceEventSink, Resource
3+
from maa.tasker import TaskerEventSink, Tasker
4+
from maa.context import ContextEventSink, Context
5+
6+
from app.common.signal_bus import signalBus
7+
8+
9+
class MaaSink(
10+
ControllerEventSink, ResourceEventSink, TaskerEventSink, ContextEventSink
11+
):
12+
13+
def on_raw_notification(self, *args, **kwargs):
14+
print(f"[MaaSink] 原始数据: {type(args)}, kwargs: {kwargs}")
15+
16+
def on_controller_action(
17+
self,
18+
controller: Controller,
19+
noti_type: NotificationType,
20+
detail: ControllerEventSink.ControllerActionDetail,
21+
):
22+
signalBus.callback.emit(
23+
{"name": "on_controller_action", "status": noti_type.value}
24+
)
25+
26+
def on_resource_loading(
27+
self,
28+
resource: Resource,
29+
noti_type: NotificationType,
30+
detail: ResourceEventSink.ResourceLoadingDetail,
31+
):
32+
pass
33+
34+
def on_tasker_task(
35+
self,
36+
tasker: Tasker,
37+
noti_type: NotificationType,
38+
detail: TaskerEventSink.TaskerTaskDetail,
39+
):
40+
signalBus.callback.emit(
41+
{"name": "on_tasker_task", "task": detail.entry, "status": noti_type.value}
42+
)
43+
44+
def on_node_next_list(
45+
self,
46+
context: Context,
47+
noti_type: NotificationType,
48+
detail: ContextEventSink.NodeNextListDetail,
49+
):
50+
pass
51+
52+
def on_node_recognition(
53+
self,
54+
context: Context,
55+
noti_type: NotificationType,
56+
detail: ContextEventSink.NodeRecognitionDetail,
57+
):
58+
focus_mapping = {
59+
1: "start",
60+
2: "succeeded",
61+
3: "failed",
62+
}
63+
send_msg = {
64+
"name": "on_task_recognition",
65+
"task": detail.name,
66+
"status": noti_type.value,
67+
"focus": detail.focus.get(focus_mapping[noti_type.value], ""),
68+
}
69+
if (
70+
detail.focus.get("aborted")
71+
and not detail.focus.get(focus_mapping[1])
72+
and not detail.focus.get(focus_mapping[2])
73+
and not detail.focus.get(focus_mapping[3])
74+
):
75+
send_msg["aborted"] = True
76+
signalBus.callback.emit(send_msg)
77+
78+
def on_node_action(
79+
self,
80+
context: Context,
81+
noti_type: NotificationType,
82+
detail: ContextEventSink.NodeActionDetail,
83+
):
84+
print(
85+
f"[MaaSink] Node Action - Context: {context}, Type: {noti_type}, Detail: {detail}"
86+
)

app/utils/maafw.py

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -54,14 +54,14 @@
5454

5555
from asyncify import asyncify
5656
import maa
57-
from maa.context import Context
57+
from maa.context import Context, ContextEventSink
5858
from maa.custom_action import CustomAction
5959
from maa.custom_recognition import CustomRecognition
6060

61-
from maa.controller import AdbController, Win32Controller
62-
from maa.tasker import Tasker, NotificationHandler
61+
from maa.controller import AdbController, Win32Controller, ControllerEventSink
62+
from maa.tasker import Tasker, TaskerEventSink
6363
from maa.agent_client import AgentClient
64-
from maa.resource import Resource
64+
from maa.resource import Resource, ResourceEventSink
6565
from maa.toolkit import Toolkit, AdbDevice, DesktopWindow
6666
from maa.define import MaaAdbScreencapMethodEnum, MaaAdbInputMethodEnum
6767

@@ -71,6 +71,7 @@
7171
from ..common.config import cfg
7272
from ..utils.tool import Read_Config, path_to_list
7373
from ..utils.tool import ProcessThread
74+
from ..utils.maa_sink import MaaSink
7475

7576

7677
# 以下代码引用自 MaaDebugger 项目的 ./src/MaaDebugger/maafw/__init__.py 文件,用于生成maafw实例
@@ -79,8 +80,8 @@ class MaaFW:
7980
resource: Resource | None
8081
controller: AdbController | Win32Controller | None
8182
tasker: Tasker | None
82-
notification_handler: NotificationHandler | None
8383
agent: AgentClient | None
84+
maa_sink : MaaSink|None
8485

8586
def __init__(self):
8687

@@ -90,7 +91,8 @@ def __init__(self):
9091
self.resource = None
9192
self.controller = None
9293
self.tasker = None
93-
self.notification_handler = None
94+
self.maa_sink = None
95+
9496
self.agent = None
9597
self.agent_thread = None
9698

@@ -101,8 +103,11 @@ def change_log_path(self, new_path: str):
101103
Args:
102104
new_path (str): 新的用户目录路径。
103105
"""
104-
if not self.tasker:
105-
self.tasker = Tasker(notification_handler=self.notification_handler)
106+
if self.tasker is None:
107+
self.tasker = Tasker()
108+
if self.maa_sink is not None:
109+
self.tasker.add_context_sink(self.maa_sink)
110+
self.tasker.add_sink(self.maa_sink)
106111
logger.info(f"更改日志路径为{new_path}")
107112
if new_path:
108113
self.tasker.set_log_dir(new_path)
@@ -206,6 +211,8 @@ def connect_adb(
206211
self.controller = AdbController(
207212
adb_path, address, screencap_method, input_method, config
208213
)
214+
if self.maa_sink is not None:
215+
self.controller.add_sink(self.maa_sink)
209216
connected = self.controller.post_connection().wait().succeeded
210217
if not connected:
211218
print(f"Failed to connect {adb_path} {address}")
@@ -227,6 +234,9 @@ def connect_win32hwnd(
227234
self.controller = Win32Controller(
228235
hwnd, screencap_method=screencap_method, input_method=input_method # type: ignore
229236
)
237+
if self.maa_sink is not None:
238+
self.controller.add_sink(self.maa_sink)
239+
230240
connected = self.controller.post_connection().wait().succeeded
231241
if not connected:
232242
print(f"Failed to connect {hwnd}")
@@ -238,6 +248,8 @@ def connect_win32hwnd(
238248
def load_resource(self, dir: str) -> bool:
239249
if not self.resource:
240250
self.resource = Resource()
251+
if self.maa_sink is not None:
252+
self.resource.add_sink(self.maa_sink)
241253
gpu_index = maa_config_data.config.get("gpu", -1)
242254
if not isinstance(gpu_index, int):
243255
logger.warning("gpu_index 不是 int 类型,使用默认值 -1")
@@ -256,7 +268,10 @@ def load_resource(self, dir: str) -> bool:
256268
@asyncify
257269
def run_task(self, entry: str, pipeline_override: dict = {}) -> bool:
258270
if not self.tasker:
259-
self.tasker = Tasker(notification_handler=self.notification_handler)
271+
self.tasker = Tasker()
272+
if self.maa_sink is not None:
273+
self.tasker.add_context_sink(self.maa_sink)
274+
self.tasker.add_sink(self.maa_sink)
260275

261276
if not self.resource or not self.controller:
262277
signalBus.custom_info.emit({"type": "error_r"})

app/utils/tool.py

Lines changed: 0 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@
4040
import base64
4141
import logging
4242
from datetime import datetime, timedelta
43-
from maa.notification_handler import NotificationHandler, NotificationType
4443

4544
from PySide6.QtCore import QThread
4645
from PySide6.QtGui import QIcon
@@ -1210,53 +1209,6 @@ def replace_placeholder(obj):
12101209
"entry":entry,
12111210
"pipeline_override":override_options
12121211
}
1213-
class MyNotificationHandler(NotificationHandler):
1214-
1215-
def __init__(self, parent=None):
1216-
self.callbackSignal = signalBus
1217-
1218-
def on_controller_action(
1219-
self,
1220-
noti_type: NotificationType,
1221-
detail: NotificationHandler.ControllerActionDetail,
1222-
):
1223-
self.callbackSignal.callback.emit(
1224-
{"name": "on_controller_action", "status": noti_type.value}
1225-
)
1226-
1227-
def on_tasker_task(
1228-
self, noti_type: NotificationType, detail: NotificationHandler.TaskerTaskDetail
1229-
):
1230-
1231-
self.callbackSignal.callback.emit(
1232-
{"name": "on_tasker_task", "task": detail.entry, "status": noti_type.value}
1233-
)
1234-
1235-
def on_node_recognition(
1236-
self,
1237-
noti_type: NotificationType,
1238-
detail: NotificationHandler.NodeRecognitionDetail,
1239-
):
1240-
focus_mapping = {
1241-
1: "start",
1242-
2: "succeeded",
1243-
3: "failed",
1244-
}
1245-
send_msg = {
1246-
"name": "on_task_recognition",
1247-
"task": detail.name,
1248-
"status": noti_type.value,
1249-
"focus": detail.focus.get(focus_mapping[noti_type.value], ""),
1250-
}
1251-
if (
1252-
detail.focus.get("aborted")
1253-
and not detail.focus.get(focus_mapping[1])
1254-
and not detail.focus.get(focus_mapping[2])
1255-
and not detail.focus.get(focus_mapping[3])
1256-
):
1257-
send_msg["aborted"] = True
1258-
self.callbackSignal.callback.emit(send_msg)
1259-
12601212

12611213
class ProcessThread(QThread):
12621214
output_signal = signalBus.agent_info

app/utils/widget.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,6 @@
7676
)
7777
from qfluentwidgets import FluentIcon as FIF
7878

79-
import traceback
8079
import os
8180
from typing import Union, Dict, List
8281

app/view/task_interface.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@
5757
ToolTipFilter,
5858
ToolTipPosition,
5959
)
60+
from datetime import datetime, timedelta
61+
from maa.toolkit import AdbDevice
6062

6163
from ..view.UI_task_interface import Ui_Task_Interface
6264

@@ -78,11 +80,10 @@
7880
get_console_path,
7981
find_executable_path_by_port,
8082
get_override,
81-
MyNotificationHandler,
8283
)
8384
from ..utils.maafw import maafw
8485
from ..common.config import cfg
85-
from maa.toolkit import AdbDevice
86+
8687
from ..utils.logger import logger
8788
from ..common.maa_config_data import maa_config_data
8889
from ..common.typeddict import (
@@ -93,7 +94,8 @@
9394
InterfaceData,
9495
)
9596
from ..utils.notice import send_thread
96-
from datetime import datetime, timedelta
97+
from ..utils.maa_sink import MaaSink
98+
9799

98100

99101
class TaskInterface(Ui_Task_Interface, QWidget):
@@ -108,7 +110,7 @@ def __init__(self, parent=None):
108110
super().__init__(parent=parent)
109111
self.setupUi(self)
110112

111-
maafw.notification_handler = MyNotificationHandler()
113+
maafw.maa_sink = MaaSink()
112114
self.bind_signals()
113115
self.init_widget_text()
114116
if cfg.get(cfg.resource_exist):

0 commit comments

Comments
 (0)