maa_framework/
msg.rs

1use serde::{Deserialize, Serialize};
2use serde_json::Value;
3
4use crate::MaaResult;
5
6#[derive(Debug, Serialize, Deserialize, Clone)]
7pub struct MaaMsgResource {
8    pub id: i32,
9    pub path: String,
10}
11
12#[derive(Debug, Serialize, Deserialize, Clone)]
13pub struct MaaMsgUUID {
14    pub uuid: String,
15}
16
17#[derive(Debug, Serialize, Deserialize, Clone)]
18pub struct MaaMsgResolution {
19    pub width: i32,
20    pub height: i32,
21}
22
23#[derive(Debug, Serialize, Deserialize, Clone)]
24pub struct MaaMsgConnect {
25    pub uuid: String,
26    pub resolution: MaaMsgResolution,
27}
28
29#[derive(Debug, Serialize, Deserialize, Clone)]
30pub struct MaaMsgConnectFailed {
31    pub why: String,
32}
33
34#[derive(Debug, Serialize, Deserialize, Clone)]
35pub struct MaaMsgAction {
36    pub id: i32,
37}
38
39#[derive(Debug, Serialize, Deserialize, Clone)]
40pub struct MaaMsgTask {
41    pub id: i32,
42    pub entry: String,
43    pub name: String,
44    pub uuid: String,
45    pub hash: String,
46}
47
48#[derive(Debug, Serialize, Deserialize, Clone)]
49pub struct MaaMsgTaskFocus {
50    pub id: i32,
51    pub entry: String,
52    pub name: String,
53    pub uuid: String,
54    pub hash: String,
55    pub recognition: Value,
56    pub run_times: i32,
57    pub last_time: String,
58    pub status: String,
59}
60
61#[derive(Debug, Serialize, Deserialize, Clone)]
62pub struct MaaMsgTaskDebug {
63    pub id: i32,
64    pub entry: String,
65    pub uuid: String,
66    pub hash: String,
67    pub name: String,
68    pub latest_hit: String,
69    pub recognition: Value,
70    pub run_times: i32,
71    pub status: String,
72}
73
74#[non_exhaustive]
75#[derive(Debug, Serialize, Deserialize, Clone)]
76pub enum MaaMsg {
77    Invalid,
78
79    ResourceStartLoading(MaaMsgResource),
80    ResourceLoadingCompleted(MaaMsgResource),
81    ResourceLoadingFailed(MaaMsgResource),
82
83    ControllerUUIDGot(MaaMsgUUID),
84    ControllerUUIDGetFailed,
85
86    ControllerResolutionGot(MaaMsgResolution),
87    ControllerResolutionGetFailed,
88
89    ControllerScreencapInited,
90    ControllerScreencapInitFailed,
91    ControllerTouchInputInited,
92    ControllerTouchInputInitFailed,
93    ControllerKeyInputInited,
94    ControllerKeyInputInitFailed,
95
96    ControllerConnectSuccess(MaaMsgConnect),
97    ControllerConnectFailed(MaaMsgConnectFailed),
98
99    ControllerActionStarted(MaaMsgAction),
100    ControllerActionCompleted(MaaMsgAction),
101    ControllerActionFailed(MaaMsgAction),
102
103    TaskStarted(MaaMsgTask),
104    TaskCompleted(MaaMsgTask),
105    TaskFailed(MaaMsgTask),
106    TaskStopped(MaaMsgTask),
107
108    TaskFocusHit(MaaMsgTaskFocus),
109    TaskFocusRunout(MaaMsgTaskFocus),
110    TaskFocusCompleted(MaaMsgTaskFocus),
111
112    TaskDebugReadyToTun(MaaMsgTaskDebug),
113    TaskDebugRunout(MaaMsgTaskDebug),
114    TaskDebugCompleted(MaaMsgTaskDebug),
115    TaskDebugListToRecognize,
116    TaskDebugHit,
117}
118
119impl MaaMsg {
120    pub fn from(msg: &str, details: &str) -> MaaResult<Self> {
121        let value = match msg {
122            "Resource.StartLoading" => {
123                let details = serde_json::from_str(details)?;
124                MaaMsg::ResourceStartLoading(details)
125            }
126            "Resource.LoadingCompleted" => {
127                let details = serde_json::from_str(details)?;
128                MaaMsg::ResourceLoadingCompleted(details)
129            }
130            "Resource.LoadingFailed" => {
131                let details = serde_json::from_str(details)?;
132                MaaMsg::ResourceLoadingFailed(details)
133            }
134            "Controller.UUIDGot" => {
135                let details = serde_json::from_str(details)?;
136                MaaMsg::ControllerUUIDGot(details)
137            }
138            "Controller.UUIDGetFailed" => MaaMsg::ControllerUUIDGetFailed,
139            "Controller.ResolutionGot" => {
140                let details = serde_json::from_str(details)?;
141                MaaMsg::ControllerResolutionGot(details)
142            }
143            "Controller.ResolutionGetFailed" => MaaMsg::ControllerResolutionGetFailed,
144            "Controller.ScreencapInited" => MaaMsg::ControllerScreencapInited,
145            "Controller.ScreencapInitFailed" => MaaMsg::ControllerScreencapInitFailed,
146            "Controller.TouchInputInited" => MaaMsg::ControllerTouchInputInited,
147            "Controller.TouchInputInitFailed" => MaaMsg::ControllerTouchInputInitFailed,
148            "Controller.KeyInputInited" => MaaMsg::ControllerKeyInputInited,
149            "Controller.KeyInputInitFailed" => MaaMsg::ControllerKeyInputInitFailed,
150            "Controller.ConnectSuccess" => {
151                let details = serde_json::from_str(details)?;
152                MaaMsg::ControllerConnectSuccess(details)
153            }
154            "Controller.ConnectFailed" => {
155                let details = serde_json::from_str(details)?;
156                MaaMsg::ControllerConnectFailed(details)
157            }
158            "Controller.ActionStarted" => {
159                let details = serde_json::from_str(details)?;
160                MaaMsg::ControllerActionStarted(details)
161            }
162            "Controller.ActionCompleted" => {
163                let details = serde_json::from_str(details)?;
164                MaaMsg::ControllerActionCompleted(details)
165            }
166            "Controller.ActionFailed" => {
167                let details = serde_json::from_str(details)?;
168                MaaMsg::ControllerActionFailed(details)
169            }
170            "Task.Started" => {
171                let details = serde_json::from_str(details)?;
172                MaaMsg::TaskStarted(details)
173            }
174            "Task.Completed" => {
175                let details = serde_json::from_str(details)?;
176                MaaMsg::TaskCompleted(details)
177            }
178            "Task.Failed" => {
179                let details = serde_json::from_str(details)?;
180                MaaMsg::TaskFailed(details)
181            }
182            "Task.Stopped" => {
183                let details = serde_json::from_str(details)?;
184                MaaMsg::TaskStopped(details)
185            }
186            "Task.Focus.ReadyToRun" => {
187                let details = serde_json::from_str(details)?;
188                MaaMsg::TaskFocusHit(details)
189            }
190            "Task.Focus.Runout" => {
191                let details = serde_json::from_str(details)?;
192                MaaMsg::TaskFocusRunout(details)
193            }
194            "Task.Focus.Completed" => {
195                let details = serde_json::from_str(details)?;
196                MaaMsg::TaskFocusCompleted(details)
197            }
198            "Task.Debug.ReadyToRun" => {
199                let details = serde_json::from_str(details)?;
200                MaaMsg::TaskDebugReadyToTun(details)
201            }
202            "Task.Debug.Runout" => {
203                let details = serde_json::from_str(details)?;
204                MaaMsg::TaskDebugRunout(details)
205            }
206            "Task.Debug.Completed" => {
207                let details = serde_json::from_str(details)?;
208                MaaMsg::TaskDebugCompleted(details)
209            }
210            "Task.Debug.ListToRecognize" => MaaMsg::TaskDebugListToRecognize,
211            "Task.Debug.Hit" => MaaMsg::TaskDebugHit,
212            _ => MaaMsg::Invalid,
213        };
214
215        Ok(value)
216    }
217}