1use crate::{
2 buffer::{
3 image_buffer::MaaImageBuffer, rect_buffer::MaaRectBuffer, string_buffer::MaaStringBuffer,
4 },
5 error::Error,
6 instance::TaskParam,
7 internal, maa_bool, MaaResult,
8};
9
10pub struct MaaSyncContext {
11 handle: internal::MaaSyncContextHandle,
12}
13
14unsafe impl Send for MaaSyncContext {}
15unsafe impl Sync for MaaSyncContext {}
16
17impl From<internal::MaaSyncContextHandle> for MaaSyncContext {
18 fn from(handle: internal::MaaSyncContextHandle) -> Self {
19 MaaSyncContext { handle }
20 }
21}
22
23impl MaaSyncContext {
24 pub fn run_task<T>(&self, task_name: &str, param: T) -> MaaResult<()>
25 where
26 T: TaskParam,
27 {
28 let param = param.get_param();
29 let name = internal::to_cstring(task_name);
30 let param = internal::to_cstring(¶m);
31
32 let ret = unsafe { internal::MaaSyncContextRunTask(self.handle, name, param) };
33
34 if maa_bool!(ret) {
35 Ok(())
36 } else {
37 Err(crate::error::Error::MaaSyncContextRunTaskError(
38 task_name.to_owned(),
39 ))
40 }
41 }
42
43 pub fn run_recognizer<T>(
44 &self,
45 image: MaaImageBuffer,
46 task_name: &str,
47 task_param: T,
48 ) -> MaaResult<(MaaRectBuffer, String)>
49 where
50 T: TaskParam,
51 {
52 let rect_buffer = MaaRectBuffer::new();
53 let result = MaaStringBuffer::new();
54
55 let task_param = task_param.get_param();
56
57 let name = internal::to_cstring(task_name);
58 let task_param = internal::to_cstring(&task_param);
59
60 let ret = unsafe {
61 internal::MaaSyncContextRunRecognition(
62 self.handle,
63 image.handle,
64 name,
65 task_param,
66 rect_buffer.handle,
67 result.handle,
68 )
69 };
70
71 if maa_bool!(ret) {
72 Ok((rect_buffer, result.string()))
73 } else {
74 Err(crate::error::Error::MaaSyncContextRunRecognizerError(
75 task_name.to_owned(),
76 ))
77 }
78 }
79
80 pub fn run_action<T>(
81 &self,
82 task_name: &str,
83 task_param: T,
84 cur_box: MaaRectBuffer,
85 cur_rec_detail: &str,
86 ) -> MaaResult<()>
87 where
88 T: TaskParam,
89 {
90 let param = task_param.get_param();
91 let name = internal::to_cstring(task_name);
92 let param = internal::to_cstring(¶m);
93 let cur_rec_detail = internal::to_cstring(cur_rec_detail);
94
95 let ret = unsafe {
96 internal::MaaSyncContextRunAction(
97 self.handle,
98 name,
99 param,
100 cur_box.handle,
101 cur_rec_detail,
102 )
103 };
104
105 maa_bool!(ret, MaaSyncContextRunActionError, task_name.to_owned())
106 }
107
108 pub fn click(&self, x: i32, y: i32) -> MaaResult<()> {
109 let ret = unsafe { internal::MaaSyncContextClick(self.handle, x, y) };
110
111 maa_bool!(ret, MaaSyncContextClickError)
112 }
113
114 pub fn swipe(&self, x1: i32, y1: i32, x2: i32, y2: i32, duration: i32) -> MaaResult<()> {
115 let ret = unsafe { internal::MaaSyncContextSwipe(self.handle, x1, y1, x2, y2, duration) };
116
117 maa_bool!(ret, MaaSyncContextSwipeError)
118 }
119
120 pub fn press_key(&self, keycode: i32) -> MaaResult<()> {
121 let ret = unsafe { internal::MaaSyncContextPressKey(self.handle, keycode) };
122
123 maa_bool!(ret, MaaSyncContextPressKeyError, keycode)
124 }
125
126 pub fn input_text(&self, text: &str) -> MaaResult<()> {
127 let text_str = internal::to_cstring(text);
128 let ret = unsafe { internal::MaaSyncContextInputText(self.handle, text_str) };
129
130 maa_bool!(ret, MaaSyncContextInputTextError, text.to_owned())
131 }
132
133 pub fn touch_down(&self, contact: i32, x: i32, y: i32, pressure: i32) -> MaaResult<()> {
134 let ret =
135 unsafe { internal::MaaSyncContextTouchDown(self.handle, contact, x, y, pressure) };
136
137 maa_bool!(ret, MaaSyncContextTouchDownError)
138 }
139
140 pub fn touch_move(&self, contact: i32, x: i32, y: i32, pressure: i32) -> MaaResult<()> {
141 let ret =
142 unsafe { internal::MaaSyncContextTouchMove(self.handle, contact, x, y, pressure) };
143
144 maa_bool!(ret, MaaSyncContextTouchMoveError)
145 }
146
147 pub fn touch_up(&self, contact: i32) -> MaaResult<()> {
148 let ret = unsafe { internal::MaaSyncContextTouchUp(self.handle, contact) };
149
150 maa_bool!(ret, MaaSyncContextTouchUpError)
151 }
152
153 pub fn screencap(&self) -> MaaResult<MaaImageBuffer> {
154 let buffer = MaaImageBuffer::new();
155
156 let ret = unsafe { internal::MaaSyncContextScreencap(self.handle, buffer.handle) };
157
158 if maa_bool!(ret) {
159 Ok(buffer)
160 } else {
161 Err(Error::MaaSyncContextScreencapError)
162 }
163 }
164
165 pub fn cached_image(&self) -> MaaResult<MaaImageBuffer> {
166 let buffer = MaaImageBuffer::new();
167
168 let ret = unsafe { internal::MaaSyncContextCachedImage(self.handle, buffer.handle) };
169
170 if maa_bool!(ret) {
171 Ok(buffer)
172 } else {
173 Err(Error::MaaSyncContextCachedImageError)
174 }
175 }
176}