Skip to main content

mirai/message/
mod.rs

1//! You can use [`fetch_newest_message`] (or other similar function in [receive] mod) to get a message from the server,
2//! or use [`send_message`] (which in [send] mod) to send a message to someone by the server.
3//!
4//! ## The Message Structure
5//!
6//! [`Message`] is a struct contains the message what you want to send, it has following fields:
7//!
8//! * quote: [`quote`] is an optional property, if you want to reply to someone, you can use [`quote`].
9//! * message_chain: Message chain is the content of a [`Message`], it contains [`SingleMessage`]s.
10//!
11//! ## MessageBuilder
12//!
13//! [`MessageBuilder`] provides a way to build a message in builder-like flavor.
14//!
15//! like this:
16//!
17//! ```rust
18//! use mirai::message::MessageBuilder;
19//!
20//! let message = MessageBuilder::new()
21//!                 .append_message("Hello".into())
22//!                 .build();
23//! ```
24//!
25
26pub mod event;
27pub mod single;
28pub mod element;
29pub mod channel;
30pub mod send;
31pub mod receive;
32
33use crate::error::Result;
34
35pub use channel::MessageChannel;
36pub use single::SingleMessage;
37pub use event::EventPacket;
38pub use element::{Group, GroupMember, FriendMember};
39
40pub type MessageChain = Vec<SingleMessage>;
41pub type MessageID = i64;
42pub type TimeStamp = u64;
43
44#[derive(Debug, Clone)]
45pub struct Message {
46    pub quote: Option<MessageID>,
47    pub message_chain: Vec<SingleMessage>,
48}
49
50impl Message {
51    pub fn new(quote: Option<MessageID>, message_chain: &Vec<SingleMessage>) -> Message {
52        Message {
53            quote,
54            message_chain: message_chain.to_vec(),
55        }
56    }
57}
58
59impl From<MessageBuilder> for Message {
60    fn from(builder: MessageBuilder) -> Self {
61        builder.build().unwrap()
62    }
63}
64
65#[derive(Debug, Clone)]
66pub struct MessageBuilder {
67    quote: Option<MessageID>,
68    message_chain: Vec<SingleMessage>,
69}
70
71/// # MessageBuilder
72///
73/// `MessageBuilder` can build a `Message` by builder-like flavor.
74///
75/// When invoking [build] function, `MessageBuilder` need: [target] and a non-empty [message_chain],
76/// if not, [build] function will returns an Error.
77///
78impl MessageBuilder {
79    pub fn new() -> MessageBuilder {
80        MessageBuilder {
81            quote: None,
82            message_chain: Vec::new(),
83        }
84    }
85
86    pub fn append_message(mut self, msg: SingleMessage) -> MessageBuilder {
87        self.message_chain.push(msg);
88        self
89    }
90
91    pub fn quote(mut self, quote: MessageID) -> MessageBuilder {
92        self.quote = Some(quote);
93        self
94    }
95
96    pub fn build(self) -> Result<Message> {
97        Ok(Message {
98            quote: self.quote,
99            message_chain: self.message_chain,
100        })
101    }
102}