Skip to main content

nagisa_core/
refs.rs

1//! 类型化目标句柄:`bot.group(g).member(u).mute(secs)`。
2//!
3//! 一个句柄既**命名**目标、又是**操作**它的入口。
4//! 这些 ref 是 [`Bot`] 上既有扁平方法的薄包装(`Bot` 仍是实现底座),但把按目标分组的、
5//! 受 `Capability` 约束的操作聚到一起,发现性远好于一长串 `bot.set_group_member_*`。
6use crate::bot::Bot;
7use nagisa_types::prelude::*;
8
9/// 群句柄。
10#[derive(Clone)]
11pub struct GroupRef {
12    bot: Bot,
13    group: Uin,
14}
15
16/// 群成员句柄。
17#[derive(Clone)]
18pub struct MemberRef {
19    bot: Bot,
20    group: Uin,
21    user: Uin,
22}
23
24/// 好友句柄。
25#[derive(Clone)]
26pub struct FriendRef {
27    bot: Bot,
28    user: Uin,
29}
30
31impl Bot {
32    /// 取一个群句柄。
33    pub fn group(&self, id: impl Into<Uin>) -> GroupRef {
34        GroupRef { bot: self.clone(), group: id.into() }
35    }
36    /// 取一个好友句柄。
37    pub fn friend(&self, id: impl Into<Uin>) -> FriendRef {
38        FriendRef { bot: self.clone(), user: id.into() }
39    }
40}
41
42impl GroupRef {
43    /// 该群的对端寻址。
44    pub fn peer(&self) -> Peer {
45        Peer::group(self.group)
46    }
47    /// 该群的群号。
48    pub fn id(&self) -> Uin {
49        self.group
50    }
51    /// 取该群某成员的句柄。
52    pub fn member(&self, user: impl Into<Uin>) -> MemberRef {
53        MemberRef { bot: self.bot.clone(), group: self.group, user: user.into() }
54    }
55    pub async fn send(&self, message: &[Segment]) -> Result<MessageId> {
56        self.bot.send(&self.peer(), message).await
57    }
58    pub async fn info(&self, no_cache: bool) -> Result<GroupInfo> {
59        self.bot.get_group_info(self.group, no_cache).await
60    }
61    pub async fn members(&self) -> Result<Vec<MemberInfo>> {
62        self.bot.get_group_member_list(self.group, false).await
63    }
64    pub async fn set_name(&self, name: &str) -> Result<()> {
65        self.bot.set_group_name(self.group, name).await
66    }
67    pub async fn whole_mute(&self, enable: bool) -> Result<()> {
68        self.bot.set_group_whole_mute(self.group, enable).await
69    }
70    pub async fn leave(&self, dismiss: bool) -> Result<()> {
71        self.bot.leave_group(self.group, dismiss).await
72    }
73    pub async fn set_avatar(&self, src: ResourceSource) -> Result<()> {
74        self.bot.set_group_avatar(self.group, src).await
75    }
76    pub async fn send_announcement(&self, content: &str, image: Option<ResourceSource>) -> Result<String> {
77        self.bot.send_group_announcement(self.group, content, image).await
78    }
79    pub async fn announcements(&self) -> Result<Vec<Announcement>> {
80        self.bot.get_group_announcements(self.group).await
81    }
82    pub async fn essence_messages(&self) -> Result<Vec<EssenceMessage>> {
83        self.bot.get_essence_messages(self.group).await
84    }
85    pub async fn files(&self, folder_id: Option<&str>) -> Result<GroupFileList> {
86        self.bot.get_group_files(self.group, folder_id).await
87    }
88}
89
90impl MemberRef {
91    pub fn group(&self) -> Uin {
92        self.group
93    }
94    pub fn uin(&self) -> Uin {
95        self.user
96    }
97    pub async fn info(&self, no_cache: bool) -> Result<MemberInfo> {
98        self.bot.get_group_member_info(self.group, self.user, no_cache).await
99    }
100    /// 禁言 `seconds` 秒。
101    pub async fn mute(&self, seconds: u32) -> Result<()> {
102        self.bot.set_group_member_mute(self.group, self.user, seconds).await
103    }
104    /// 解除禁言。
105    pub async fn unmute(&self) -> Result<()> {
106        self.bot.set_group_member_mute(self.group, self.user, 0).await
107    }
108    pub async fn kick(&self, reject_add: bool) -> Result<()> {
109        self.bot.kick_group_member(self.group, self.user, reject_add).await
110    }
111    pub async fn set_card(&self, card: &str) -> Result<()> {
112        self.bot.set_group_member_card(self.group, self.user, card).await
113    }
114    pub async fn set_admin(&self, enable: bool) -> Result<()> {
115        self.bot.set_group_admin(self.group, self.user, enable).await
116    }
117    pub async fn set_title(&self, title: &str) -> Result<()> {
118        self.bot.set_group_member_special_title(self.group, self.user, title, -1).await
119    }
120    /// 戳一戳该成员。
121    pub async fn poke(&self) -> Result<()> {
122        self.bot.send_nudge(&Peer::group(self.group), self.user).await
123    }
124}
125
126impl FriendRef {
127    pub fn peer(&self) -> Peer {
128        Peer::friend(self.user)
129    }
130    pub fn uin(&self) -> Uin {
131        self.user
132    }
133    pub async fn send(&self, message: &[Segment]) -> Result<MessageId> {
134        self.bot.send(&self.peer(), message).await
135    }
136    /// 该用户档案(陌生人也可)。
137    pub async fn profile(&self, no_cache: bool) -> Result<UserInfo> {
138        self.bot.get_user_info(self.user, no_cache).await
139    }
140    pub async fn info(&self) -> Result<FriendInfo> {
141        self.bot.get_friend_info(self.user).await
142    }
143    pub async fn delete(&self) -> Result<()> {
144        self.bot.delete_friend(self.user).await
145    }
146    pub async fn set_remark(&self, remark: &str) -> Result<()> {
147        self.bot.set_friend_remark(self.user, remark).await
148    }
149    /// 资料卡点赞 `count` 次。
150    pub async fn like(&self, count: u32) -> Result<()> {
151        self.bot.send_profile_like(self.user, count).await
152    }
153    pub async fn poke(&self) -> Result<()> {
154        self.bot.send_nudge(&self.peer(), self.user).await
155    }
156}