1use crate::adapter::Adapter;
2use crate::context::Context;
3use crate::error::FrameworkResult;
4use crate::message::MessageElement;
5use crate::types::*;
6use std::sync::Arc;
7
8pub struct Bot {
10 pub adapter: Arc<dyn Adapter>,
12 pub ctx: Arc<Context>,
16 pub platform: String,
18 pub self_id: String,
20 pub state: LoginStatus,
22 pub user: User,
24}
25
26impl Bot {
27 pub fn new(ctx: Arc<Context>, adapter_instance: Arc<dyn Adapter>) -> Self {
39 let platform = adapter_instance.get_name();
40 Bot {
41 adapter: adapter_instance,
42 ctx,
44 platform,
45 self_id: String::new(),
46 state: LoginStatus::Offline,
47 user: User::default(),
48 }
49 }
50
51 pub async fn start(self: Arc<Self>) -> FrameworkResult<()> {
61 tracing::info!("尝试启动适配器: {}", self.platform);
62 self.adapter.connect(self.clone()).await; tracing::info!("适配器 {} 已启动。", self.platform);
64 Ok(())
65 }
66
67 pub async fn stop(self: Arc<Self>) -> FrameworkResult<()> {
77 tracing::info!("尝试停止适配器: {}", self.platform);
78 self.adapter.disconnect(self.clone()).await;
79 tracing::info!("适配器 {} 已停止。", self.platform);
80 Ok(())
81 }
82
83 pub fn online(&mut self) {
85 self.state = LoginStatus::Online
86 }
87
88 pub fn offline(&mut self) {
90 self.state = LoginStatus::Offline
91 }
92
93 pub async fn create_reaction(
95 &self,
96 message_id: &str,
97 channel_id: &str,
98 emoji: &str,
99 ) -> FrameworkResult<()> {
100 self.adapter
101 .create_reaction(message_id, channel_id, emoji)
102 .await
103 }
104
105 pub async fn delete_reaction(
107 &self,
108 message_id: &str,
109 channel_id: &str,
110 emoji: &str,
111 user_id: &str,
112 ) -> FrameworkResult<()> {
113 self.adapter
114 .delete_reaction(message_id, channel_id, emoji, user_id)
115 .await
116 }
117
118 pub async fn clear_reaction(
120 &self,
121 message_id: &str,
122 channel_id: &str,
123 emoji: &str,
124 ) -> FrameworkResult<()> {
125 self.adapter
126 .clear_reaction(message_id, channel_id, emoji)
127 .await
128 }
129
130 pub async fn get_reaction_list(
132 &self,
133 message_id: &str,
134 channel_id: &str,
135 emoji: &str,
136 next: Option<&str>,
137 ) -> FrameworkResult<Vec<User>> {
138 self.adapter
139 .get_reaction_list(message_id, channel_id, emoji, next)
140 .await
141 }
142
143 pub async fn get_channel(&self, channel_id: &str) -> FrameworkResult<Channel> {
145 self.adapter.get_channel(channel_id).await
146 }
147
148 pub async fn get_channel_list(
150 &self,
151 guild_id: &str,
152 next: Option<&str>,
153 ) -> FrameworkResult<Vec<Channel>> {
154 self.adapter.get_channel_list(guild_id, next).await
155 }
156
157 pub async fn create_channel(&self, guild_id: &str, data: Channel) -> FrameworkResult<Channel> {
159 self.adapter.create_channel(guild_id, data).await
160 }
161
162 pub async fn update_channel(&self, channel_id: &str, data: Channel) -> FrameworkResult<()> {
164 self.adapter.update_channel(channel_id, data).await
165 }
166
167 pub async fn delete_channel(&self, channel_id: &str) -> FrameworkResult<()> {
169 self.adapter.delete_channel(channel_id).await
170 }
171
172 pub async fn create_direct_channel(&self, user_id: &str) -> FrameworkResult<Channel> {
174 self.adapter.create_direct_channel(user_id).await
175 }
176
177 pub async fn set_guild_member_role(
179 &self,
180 guild_id: &str,
181 user_id: &str,
182 role_id: &str,
183 ) -> FrameworkResult<()> {
184 self.adapter
185 .set_guild_member_role(guild_id, user_id, role_id)
186 .await
187 }
188
189 pub async fn unset_guild_member_role(
191 &self,
192 guild_id: &str,
193 user_id: &str,
194 role_id: &str,
195 ) -> FrameworkResult<()> {
196 self.adapter
197 .unset_guild_member_role(guild_id, user_id, role_id)
198 .await
199 }
200
201 pub async fn get_guild_member_role_list(
203 &self,
204 guild_id: &str,
205 next: Option<&str>,
206 ) -> FrameworkResult<Vec<GuildRole>> {
207 self.adapter
208 .get_guild_member_role_list(guild_id, next)
209 .await
210 }
211
212 pub async fn create_guild_role(
214 &self,
215 guild_id: &str,
216 role_name: &str,
217 ) -> FrameworkResult<GuildRole> {
218 self.adapter.create_guild_role(guild_id, role_name).await
219 }
220
221 pub async fn update_guild_role(
223 &self,
224 guild_id: &str,
225 role_id: &str,
226 role: GuildRole,
227 ) -> FrameworkResult<()> {
228 self.adapter
229 .update_guild_role(guild_id, role_id, role)
230 .await
231 }
232
233 pub async fn delete_guild_role(&self, guild_id: &str, role_id: &str) -> FrameworkResult<()> {
235 self.adapter.delete_guild_role(guild_id, role_id).await
236 }
237
238 pub async fn send_message(
240 &self,
241 channel_id: &str,
242 elements: &[MessageElement],
243 ) -> FrameworkResult<Vec<String>> {
244 self.adapter.send_message(channel_id, elements).await
245 }
246
247 pub async fn send_private_message(
249 &self,
250 user_id: &str,
251 guild_id: &str,
252 elements: &[MessageElement],
253 ) -> FrameworkResult<Vec<String>> {
254 self.adapter
255 .send_private_message(user_id, guild_id, elements)
256 .await
257 }
258
259 pub async fn get_message(
261 &self,
262 channel_id: &str,
263 message_id: &str,
264 ) -> FrameworkResult<Message> {
265 self.adapter.get_message(channel_id, message_id).await
266 }
267
268 pub async fn delete_message(&self, channel_id: &str, message_id: &str) -> FrameworkResult<()> {
270 self.adapter.delete_message(channel_id, message_id).await
271 }
272
273 pub async fn update_message(
275 &self,
276 channel_id: &str,
277 message_id: &str,
278 elements: &[MessageElement],
279 ) -> FrameworkResult<()> {
280 self.adapter
281 .update_message(channel_id, message_id, elements)
282 .await
283 }
284
285 pub async fn get_message_list(
287 &self,
288 channel_id: &str,
289 next: Option<&str>,
290 directory: Option<&str>,
291 ) -> FrameworkResult<Vec<Message>> {
292 self.adapter
293 .get_message_list(channel_id, next, directory)
294 .await
295 }
296
297 pub async fn broadcast(
299 &self,
300 channels: Vec<String>,
301 elements: &[MessageElement],
302 ) -> FrameworkResult<()> {
303 for channel in channels {
304 self.adapter
305 .send_message(channel.as_str(), elements)
306 .await?;
307 }
308 Ok(())
309 }
310
311 pub async fn get_user(&self, user_id: &str) -> FrameworkResult<User> {
313 self.adapter.get_user(user_id).await
314 }
315
316 pub async fn get_friend_list(&self, next: Option<&str>) -> FrameworkResult<Vec<User>> {
318 self.adapter.get_friends(next).await
319 }
320
321 pub async fn handle_friend_request(
323 &self,
324 message_id: &str,
325 accept: bool,
326 comment: Option<&str>,
327 ) -> FrameworkResult<()> {
328 self.adapter
329 .handle_friend_request(message_id, accept, comment)
330 .await
331 }
332
333 pub async fn get_guild(&self, guild_id: &str) -> FrameworkResult<Guild> {
335 self.adapter.get_guild(guild_id).await
336 }
337
338 pub async fn get_guild_list(&self, next: Option<&str>) -> FrameworkResult<Vec<Guild>> {
340 self.adapter.get_guilds(next).await
341 }
342
343 pub async fn handle_guild_invite(
345 &self,
346 message_id: &str,
347 accept: bool,
348 comment: Option<&str>,
349 ) -> FrameworkResult<()> {
350 self.adapter
351 .handle_guild_invite(message_id, accept, comment)
352 .await
353 }
354
355 pub async fn get_guild_member(
357 &self,
358 guild_id: &str,
359 user_id: &str,
360 ) -> FrameworkResult<GuildMember> {
361 self.adapter.get_guild_member(guild_id, user_id).await
362 }
363
364 pub async fn get_guild_member_list(
366 &self,
367 guild_id: &str,
368 next: Option<&str>,
369 ) -> FrameworkResult<Vec<GuildMember>> {
370 self.adapter.get_guild_members(guild_id, next).await
371 }
372
373 pub async fn kick_guild_member(
375 &self,
376 guild_id: &str,
377 user_id: &str,
378 permanent: Option<bool>,
379 ) -> FrameworkResult<()> {
380 self.adapter
381 .kick_guild_member(guild_id, user_id, permanent)
382 .await
383 }
384
385 pub async fn mute_guild_member(
387 &self,
388 guild_id: &str,
389 user_id: &str,
390 duration: Option<u64>,
391 reason: &str,
392 ) -> FrameworkResult<()> {
393 self.adapter
394 .mute_guild_member(guild_id, user_id, duration, reason)
395 .await
396 }
397
398 pub async fn handle_guild_request(
400 &self,
401 message_id: &str,
402 accept: bool,
403 comment: Option<&str>,
404 ) -> FrameworkResult<()> {
405 self.adapter
406 .handle_guild_request(message_id, accept, comment)
407 .await
408 }
409
410 pub async fn get_login(&self) -> FrameworkResult<Login> {
412 self.adapter.get_login().await
413 }
414}