Skip to main content

shirabe_core/
bot.rs

1use crate::adapter::Adapter;
2use crate::context::Context;
3use crate::error::FrameworkResult;
4use crate::message::MessageElement;
5use crate::types::*;
6use std::sync::Arc;
7
8/// Bot 结构体,代表一个机器人实例
9pub struct Bot {
10    /// Bot所属的适配器实例
11    pub adapter: Arc<dyn Adapter>,
12    /// Bot配置
13    // pub config: Arc<C>,
14    /// Bot 所在的Context实例
15    pub ctx: Arc<Context>,
16    /// Bot的所在平台名称
17    pub platform: String,
18    /// Bot在平台上的 ID
19    pub self_id: String,
20    /// Bot的登录状态
21    pub state: LoginStatus,
22    /// Bot的用户信息
23    pub user: User,
24}
25
26impl Bot {
27    /// 创建一个新的 Bot 实例
28    ///
29    /// # Arguments
30    ///
31    /// * `ctx` - Bot 的应用上下文 (Arc<Context>)
32    /// * `config` - 机器人的基础配置
33    /// * `adapter_instance` - 实现了 Adapter trait 的适配器实例
34    ///
35    /// # Returns
36    ///
37    /// 返回一个新的 `Bot` 实例
38    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            // config: Arc::new(config),
43            ctx,
44            platform,
45            self_id: String::new(),
46            state: LoginStatus::Offline,
47            user: User::default(),
48        }
49    }
50
51    /// 启动适配器
52    ///
53    /// # Arguments
54    ///
55    /// * `self_arc` - 对 Bot 自身的 Arc 引用,用于传递给适配器。
56    ///
57    /// # Returns
58    ///
59    /// 如果适配器成功启动,返回 `Ok(())`,否则返回遇到的错误
60    pub async fn start(self: Arc<Self>) -> FrameworkResult<()> {
61        tracing::info!("尝试启动适配器: {}", self.platform);
62        self.adapter.connect(self.clone()).await; // self 在这里是 Arc<Bot>
63        tracing::info!("适配器 {} 已启动。", self.platform);
64        Ok(())
65    }
66
67    /// 停止所有已注册的适配器
68    ///
69    /// # Arguments
70    ///
71    /// * `self_arc` - 对 Bot 自身的 Arc 引用,用于传递给适配器。
72    ///
73    /// # Returns
74    ///
75    /// 如果配器成功停止,返回 `Ok(())`,否则返回遇到的错误
76    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    /// 修改登录状态为在线
84    pub fn online(&mut self) {
85        self.state = LoginStatus::Online
86    }
87
88    /// 修改登录状态为离线
89    pub fn offline(&mut self) {
90        self.state = LoginStatus::Offline
91    }
92
93    /// 向特定消息添加某个特定表态
94    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    /// 从特定消息删除某个用户添加的特定表态
106    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    /// 从特定消息清除某个特定表态
119    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    /// 获取添加特定消息的特定表态的用户列表
131    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    /// 获取频道信息
144    pub async fn get_channel(&self, channel_id: &str) -> FrameworkResult<Channel> {
145        self.adapter.get_channel(channel_id).await
146    }
147
148    /// 获取某个群组的频道列表
149    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    /// 创建群组频道
158    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    /// 修改群组频道
163    pub async fn update_channel(&self, channel_id: &str, data: Channel) -> FrameworkResult<()> {
164        self.adapter.update_channel(channel_id, data).await
165    }
166
167    /// 删除群组频道
168    pub async fn delete_channel(&self, channel_id: &str) -> FrameworkResult<()> {
169        self.adapter.delete_channel(channel_id).await
170    }
171
172    /// 创建私聊频道
173    pub async fn create_direct_channel(&self, user_id: &str) -> FrameworkResult<Channel> {
174        self.adapter.create_direct_channel(user_id).await
175    }
176
177    /// 设置群组内用户的角色
178    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    /// 取消群组内用户的角色
190    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    /// 获取群组内用户的角色列表
202    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    /// 创建群组角色
213    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    /// 修改群组角色
222    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    /// 删除群组角色
234    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    /// 向特定频道发送消息
239    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    /// 向特定用户发送私信
248    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    /// 获取特定消息
260    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    /// 撤回特定消息
269    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    /// 修改特定消息
274    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    /// 获取频道消息列表
286    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    /// 向多个频道广播消息
298    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    /// 获取用户信息
312    pub async fn get_user(&self, user_id: &str) -> FrameworkResult<User> {
313        self.adapter.get_user(user_id).await
314    }
315
316    /// 获取机器人的好友列表
317    pub async fn get_friend_list(&self, next: Option<&str>) -> FrameworkResult<Vec<User>> {
318        self.adapter.get_friends(next).await
319    }
320
321    /// 处理好友请求
322    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    /// 获取群组信息
334    pub async fn get_guild(&self, guild_id: &str) -> FrameworkResult<Guild> {
335        self.adapter.get_guild(guild_id).await
336    }
337
338    /// 获取机器人加入的群组列表
339    pub async fn get_guild_list(&self, next: Option<&str>) -> FrameworkResult<Vec<Guild>> {
340        self.adapter.get_guilds(next).await
341    }
342
343    /// 处理来自群组的邀请
344    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    /// 获取群成员信息
356    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    /// 获取群成员列表
365    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    /// 将某个用户踢出群组
374    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    /// 禁言某个用户
386    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    /// 处理加群请求
399    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    /// 获取登陆状态
411    pub async fn get_login(&self) -> FrameworkResult<Login> {
412        self.adapter.get_login().await
413    }
414}