Skip to main content

mirai/message/
receive.rs

1//! You can use some function in this mod to receive message or event with a session
2
3use serde::Deserialize;
4
5use crate::Code;
6use crate::session::Session;
7use crate::message::event::EventPacket;
8use crate::error::{assert, Result};
9
10impl Session {
11    async fn get_message(&self, is_fetch: bool, is_newest: bool, count: usize) -> Result<Vec<EventPacket>> {
12        #[derive(Deserialize)]
13        struct Response {
14            code: Code,
15            data: Vec<EventPacket>,
16        }
17
18        let url = format!("/{is_fetch}{is_newest}Message?sessionKey={sessionKey}&count={count}",
19                          is_fetch = if is_fetch { "fetch" } else { "peek" },
20                          is_newest = if is_newest { "Latest" } else { "" },
21                          sessionKey = self.key,
22                          count = count);
23
24        let response: Response = self.client.get(&self.url(&url))
25            .send().await?
26            .json().await?;
27
28        assert(response.code, if is_fetch { "Fetching" } else { "Peeking" })?;
29
30        Ok(response.data)
31    }
32
33    pub async fn fetch_newest_message(&self, count: usize) -> Result<Vec<EventPacket>> {
34        self.get_message(true, true, count).await
35    }
36
37    pub async fn fetch_message(&self, count: usize) -> Result<Vec<EventPacket>> {
38        self.get_message(true, false, count).await
39    }
40
41    pub async fn peek_newest_message(&self, count: usize) -> Result<Vec<EventPacket>> {
42        self.get_message(false, true, count).await
43    }
44
45    pub async fn peek_message(&self, count: usize) -> Result<Vec<EventPacket>> {
46        self.get_message(false, false, count).await
47    }
48}