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}