maa_framework/
sync_context.rs

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(&param);
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(&param);
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}