use crate::bot::Bot;
use nagisa_types::prelude::*;
#[derive(Clone)]
pub struct GroupRef {
bot: Bot,
group: Uin,
}
#[derive(Clone)]
pub struct MemberRef {
bot: Bot,
group: Uin,
user: Uin,
}
#[derive(Clone)]
pub struct FriendRef {
bot: Bot,
user: Uin,
}
impl Bot {
pub fn group(&self, id: impl Into<Uin>) -> GroupRef {
GroupRef { bot: self.clone(), group: id.into() }
}
pub fn friend(&self, id: impl Into<Uin>) -> FriendRef {
FriendRef { bot: self.clone(), user: id.into() }
}
}
impl GroupRef {
pub fn peer(&self) -> Peer {
Peer::group(self.group)
}
pub fn id(&self) -> Uin {
self.group
}
pub fn member(&self, user: impl Into<Uin>) -> MemberRef {
MemberRef { bot: self.bot.clone(), group: self.group, user: user.into() }
}
pub async fn send(&self, message: &[Segment]) -> Result<MessageId> {
self.bot.send(&self.peer(), message).await
}
pub async fn info(&self, no_cache: bool) -> Result<GroupInfo> {
self.bot.get_group_info(self.group, no_cache).await
}
pub async fn members(&self) -> Result<Vec<MemberInfo>> {
self.bot.get_group_member_list(self.group, false).await
}
pub async fn set_name(&self, name: &str) -> Result<()> {
self.bot.set_group_name(self.group, name).await
}
pub async fn whole_mute(&self, enable: bool) -> Result<()> {
self.bot.set_group_whole_mute(self.group, enable).await
}
pub async fn leave(&self, dismiss: bool) -> Result<()> {
self.bot.leave_group(self.group, dismiss).await
}
pub async fn set_avatar(&self, src: ResourceSource) -> Result<()> {
self.bot.set_group_avatar(self.group, src).await
}
pub async fn send_announcement(
&self,
content: &str,
image: Option<ResourceSource>,
) -> Result<String> {
self.bot.send_group_announcement(self.group, content, image).await
}
pub async fn announcements(&self) -> Result<Vec<Announcement>> {
self.bot.get_group_announcements(self.group).await
}
pub async fn essence_messages(&self) -> Result<Vec<EssenceMessage>> {
self.bot.get_essence_messages(self.group).await
}
pub async fn files(&self, folder_id: Option<&str>) -> Result<GroupFileList> {
self.bot.get_group_files(self.group, folder_id).await
}
}
impl MemberRef {
pub fn group(&self) -> Uin {
self.group
}
pub fn uin(&self) -> Uin {
self.user
}
pub async fn info(&self, no_cache: bool) -> Result<MemberInfo> {
self.bot.get_group_member_info(self.group, self.user, no_cache).await
}
pub async fn mute(&self, seconds: u32) -> Result<()> {
self.bot.set_group_member_mute(self.group, self.user, seconds).await
}
pub async fn unmute(&self) -> Result<()> {
self.bot.set_group_member_mute(self.group, self.user, 0).await
}
pub async fn kick(&self, reject_add: bool) -> Result<()> {
self.bot.kick_group_member(self.group, self.user, reject_add).await
}
pub async fn set_card(&self, card: &str) -> Result<()> {
self.bot.set_group_member_card(self.group, self.user, card).await
}
pub async fn set_admin(&self, enable: bool) -> Result<()> {
self.bot.set_group_admin(self.group, self.user, enable).await
}
pub async fn set_title(&self, title: &str) -> Result<()> {
self.bot.set_group_member_special_title(self.group, self.user, title, -1).await
}
pub async fn poke(&self) -> Result<()> {
self.bot.send_nudge(&Peer::group(self.group), self.user).await
}
}
impl FriendRef {
pub fn peer(&self) -> Peer {
Peer::friend(self.user)
}
pub fn uin(&self) -> Uin {
self.user
}
pub async fn send(&self, message: &[Segment]) -> Result<MessageId> {
self.bot.send(&self.peer(), message).await
}
pub async fn profile(&self, no_cache: bool) -> Result<UserInfo> {
self.bot.get_user_info(self.user, no_cache).await
}
pub async fn info(&self) -> Result<FriendInfo> {
self.bot.get_friend_info(self.user).await
}
pub async fn delete(&self) -> Result<()> {
self.bot.delete_friend(self.user).await
}
pub async fn set_remark(&self, remark: &str) -> Result<()> {
self.bot.set_friend_remark(self.user, remark).await
}
pub async fn like(&self, count: u32) -> Result<()> {
self.bot.send_profile_like(self.user, count).await
}
pub async fn poke(&self) -> Result<()> {
self.bot.send_nudge(&self.peer(), self.user).await
}
}