1use crate::bot::Bot;
7use nagisa_types::prelude::*;
8
9#[derive(Clone)]
11pub struct GroupRef {
12 bot: Bot,
13 group: Uin,
14}
15
16#[derive(Clone)]
18pub struct MemberRef {
19 bot: Bot,
20 group: Uin,
21 user: Uin,
22}
23
24#[derive(Clone)]
26pub struct FriendRef {
27 bot: Bot,
28 user: Uin,
29}
30
31impl Bot {
32 pub fn group(&self, id: impl Into<Uin>) -> GroupRef {
34 GroupRef { bot: self.clone(), group: id.into() }
35 }
36 pub fn friend(&self, id: impl Into<Uin>) -> FriendRef {
38 FriendRef { bot: self.clone(), user: id.into() }
39 }
40}
41
42impl GroupRef {
43 pub fn peer(&self) -> Peer {
45 Peer::group(self.group)
46 }
47 pub fn id(&self) -> Uin {
49 self.group
50 }
51 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 pub async fn mute(&self, seconds: u32) -> Result<()> {
102 self.bot.set_group_member_mute(self.group, self.user, seconds).await
103 }
104 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 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 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 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}