plexus_comms/activations/telegram/
activation.rs1use super::types::*;
2use crate::config::TelegramConfig;
3use async_stream::stream;
4use futures::Stream;
5
6use plexus_core::plexus;
8use plexus_core::serde_helpers;
9
10#[derive(Clone)]
11pub struct Telegram {
12 bot_token: String,
13 client: reqwest::Client,
14}
15
16impl Telegram {
17 pub async fn new(config: TelegramConfig) -> Result<Self, String> {
18 Ok(Self {
19 bot_token: config.bot_token,
20 client: reqwest::Client::new(),
21 })
22 }
23}
24
25#[plexus_macros::hub_methods(
26 namespace = "telegram",
27 version = "1.0.0",
28 description = "Send and receive messages via Telegram Bot API"
29)]
30impl Telegram {
31 #[plexus_macros::hub_method(
32 description = "Send a text message",
33 params(
34 chat_id = "Chat ID or username",
35 text = "Message text",
36 parse_mode = "Text formatting mode (optional)",
37 reply_to_message_id = "Reply to specific message (optional)"
38 )
39 )]
40 async fn send_message(
41 &self,
42 chat_id: String,
43 text: String,
44 parse_mode: Option<ParseMode>,
45 reply_to_message_id: Option<i64>,
46 ) -> impl Stream<Item = SendMessageEvent> + Send + 'static {
47 let _params = SendMessageParams {
48 chat_id: chat_id.clone(),
49 text,
50 parse_mode,
51 reply_to_message_id,
52 };
53
54 stream! {
55 yield SendMessageEvent::Sent {
57 message_id: 12345,
58 chat_id,
59 };
60 }
61 }
62
63 #[plexus_macros::hub_method(
64 description = "Send a photo",
65 params(
66 chat_id = "Chat ID or username",
67 photo = "Photo file ID or URL",
68 caption = "Photo caption (optional)"
69 )
70 )]
71 async fn send_photo(
72 &self,
73 chat_id: String,
74 photo: String,
75 caption: Option<String>,
76 ) -> impl Stream<Item = SendMessageEvent> + Send + 'static {
77 let _params = SendPhotoParams {
78 chat_id: chat_id.clone(),
79 photo,
80 caption,
81 };
82
83 stream! {
84 yield SendMessageEvent::Sent {
85 message_id: 12346,
86 chat_id,
87 };
88 }
89 }
90
91 #[plexus_macros::hub_method(
92 streaming,
93 description = "Listen for incoming updates (messages, callbacks, etc.)"
94 )]
95 async fn listen_updates(&self) -> impl Stream<Item = UpdateEvent> + Send + 'static {
96 stream! {
97 yield UpdateEvent::Error {
100 message: "Not implemented yet".to_string(),
101 };
102 }
103 }
104}