Skip to main content

mirai/message/
channel.rs

1//! Message channel is a target which you want to send to.
2//!
3//! # MessageChannel
4//!
5//! To send a message to others, you need to specify a channel which the message send to. There are three channel you can use:
6//!
7//! * Group: send a message to a group
8//! * Friend: send a message to a friend
9//! * Temp: send a message to a group member
10//!
11//! Then you can:
12//!
13//! ```rust
14//! use mirai::message::{channel::MessageChannel, MessageBuilder};
15//! use mirai::session::Session;
16//!
17//! let session: Session = my_session;
18//! let target_channel = MessageChannel::Group(group);
19//! let message = MessageBuilder::new().append_message("Hello".into()).build().unwrap();
20//!
21//! session.send_message(&target_channel, &message).await.unwrap();
22//! ```
23
24use crate::Target;
25use crate::error::{ClientError, Result};
26use crate::message::element::{GroupMember, Group, FriendMember};
27
28#[derive(Debug, Clone)]
29pub enum MessageChannel {
30    Friend(Target),
31    Group(Target),
32    Temp { qq: Target, group: Target },
33}
34
35impl MessageChannel {
36    pub fn group(self) -> Result<Target> {
37        if let MessageChannel::Group(group) = self {
38            Ok(group)
39        } else {
40            Err(ClientError("Expect Group Target".to_string()))
41        }
42    }
43
44    pub fn friend(self) -> Result<Target> {
45        if let MessageChannel::Friend(friend) = self {
46            Ok(friend)
47        } else {
48            Err(ClientError("Expect Friend Target".to_string()))
49        }
50    }
51
52    /// returns (qq, group)
53    pub fn temp(self) -> Result<(Target, Target)> {
54        if let MessageChannel::Temp { qq, group } = self {
55            Ok((qq, group))
56        } else {
57            Err(ClientError("Expect Temp Target".to_string()))
58        }
59    }
60}
61
62pub trait AsGroupChannel {
63    fn as_group_channel(&self) -> MessageChannel;
64}
65
66pub trait AsFriendChannel {
67    fn as_friend_channel(&self) -> MessageChannel;
68}
69
70pub trait AsTempChannel {
71    fn as_temp_channel(&self) -> MessageChannel;
72}
73
74impl AsGroupChannel for Target {
75    fn as_group_channel(&self) -> MessageChannel {
76        MessageChannel::Group(self.clone())
77    }
78}
79
80impl AsFriendChannel for Target {
81    fn as_friend_channel(&self) -> MessageChannel {
82        MessageChannel::Friend(self.clone())
83    }
84}
85
86impl AsTempChannel for (Target, Target) {
87    fn as_temp_channel(&self) -> MessageChannel {
88        MessageChannel::Temp { qq: self.0, group: self.1 }
89    }
90}
91
92impl AsFriendChannel for GroupMember {
93    fn as_friend_channel(&self) -> MessageChannel {
94        self.id.as_friend_channel()
95    }
96}
97
98impl AsTempChannel for GroupMember {
99    fn as_temp_channel(&self) -> MessageChannel {
100        (self.id, self.group.id).as_temp_channel()
101    }
102}
103
104impl AsGroupChannel for Group {
105    fn as_group_channel(&self) -> MessageChannel {
106        self.id.as_group_channel()
107    }
108}
109
110impl AsFriendChannel for FriendMember {
111    fn as_friend_channel(&self) -> MessageChannel {
112        self.id.as_friend_channel()
113    }
114}