misskey_api/streaming/channel/
antenna.rs

1use crate::model::{antenna::Antenna, id::Id, note::Note};
2use crate::streaming::channel::NoOutgoing;
3
4use serde::{Deserialize, Serialize};
5
6#[derive(Deserialize, Debug, Clone)]
7#[serde(rename_all = "camelCase", tag = "type", content = "body")]
8pub enum AntennaStreamEvent {
9    Note(Note),
10}
11
12#[derive(Serialize, Debug, Clone)]
13#[serde(rename_all = "camelCase")]
14pub struct Request {
15    pub antenna_id: Id<Antenna>,
16}
17
18impl misskey_core::streaming::ConnectChannelRequest for Request {
19    type Incoming = AntennaStreamEvent;
20    type Outgoing = NoOutgoing;
21
22    const NAME: &'static str = "antenna";
23}
24
25#[cfg(test)]
26mod tests {
27    use super::Request;
28    use crate::test::{websocket::TestClient, ClientExt};
29
30    use futures::{future, StreamExt};
31
32    #[tokio::test]
33    async fn subscribe_unsubscribe() {
34        use crate::model::{antenna::AntennaSource, query::Query};
35
36        let client = TestClient::new().await;
37        let antenna = client
38            .test(crate::endpoint::antennas::create::Request {
39                name: "test".to_string(),
40                src: AntennaSource::All,
41                user_list_id: None,
42                #[cfg(feature = "12-10-0")]
43                user_group_id: None,
44                keywords: Query::from_vec(vec![vec!["hello".to_string(), "awesome".to_string()]]),
45                #[cfg(feature = "12-19-0")]
46                exclude_keywords: Query::default(),
47                users: Vec::new(),
48                case_sensitive: false,
49                with_replies: false,
50                with_file: false,
51                notify: false,
52            })
53            .await;
54
55        let mut stream = client
56            .channel(Request {
57                antenna_id: antenna.id,
58            })
59            .await
60            .unwrap();
61        stream.disconnect().await.unwrap();
62    }
63
64    #[tokio::test]
65    async fn stream() {
66        use crate::model::{antenna::AntennaSource, query::Query};
67
68        let client = TestClient::new().await;
69        let antenna = client
70            .test(crate::endpoint::antennas::create::Request {
71                name: "test".to_string(),
72                src: AntennaSource::All,
73                user_list_id: None,
74                #[cfg(feature = "12-10-0")]
75                user_group_id: None,
76                keywords: Query::from_vec(vec![vec!["hello".to_string()]]),
77                #[cfg(feature = "12-19-0")]
78                exclude_keywords: Query::default(),
79                users: Vec::new(),
80                case_sensitive: false,
81                with_replies: false,
82                with_file: false,
83                notify: false,
84            })
85            .await;
86
87        let mut stream = client
88            .channel(Request {
89                antenna_id: antenna.id,
90            })
91            .await
92            .unwrap();
93
94        future::join(client.create_note(Some("hello"), None, None), async {
95            stream.next().await.unwrap().unwrap()
96        })
97        .await;
98    }
99}