@@ -4,6 +4,7 @@ use crate::store::UpsertMessageParams;
44use anyhow:: { Context , Result } ;
55use base64:: { engine:: general_purpose:: URL_SAFE_NO_PAD , Engine as _} ;
66use chrono:: Utc ;
7+ use grammers_client:: parsers:: { parse_html_message, parse_markdown_message} ;
78use grammers_client:: types:: Attribute ;
89use grammers_client:: InputMessage ;
910use grammers_session:: defs:: PeerRef ;
@@ -13,6 +14,24 @@ use std::path::Path;
1314use std:: time:: Duration ;
1415use tl:: enums:: SendMessageAction ;
1516
17+ /// Parse message text according to parse_mode, returning (text, entities).
18+ /// parse_mode: "markdown", "html", or anything else for plain text.
19+ fn apply_parse_mode ( text : & str , parse_mode : & str ) -> ( String , Option < Vec < tl:: enums:: MessageEntity > > ) {
20+ match parse_mode {
21+ "markdown" => {
22+ let ( parsed_text, entities) = parse_markdown_message ( text) ;
23+ let ents = if entities. is_empty ( ) { None } else { Some ( entities) } ;
24+ ( parsed_text, ents)
25+ }
26+ "html" => {
27+ let ( parsed_text, entities) = parse_html_message ( text) ;
28+ let ents = if entities. is_empty ( ) { None } else { Some ( entities) } ;
29+ ( parsed_text, ents)
30+ }
31+ _ => ( text. to_string ( ) , None ) ,
32+ }
33+ }
34+
1635/// Result from searching chats via Telegram API.
1736#[ derive( Debug , Clone , serde:: Serialize ) ]
1837pub struct SearchChatResult {
@@ -37,12 +56,17 @@ fn decode_file_id(file_id: &str) -> Result<(i64, i64, Vec<u8>)> {
3756
3857impl App {
3958 /// Send a text message to a chat by ID, returns the message ID.
40- pub async fn send_text ( & mut self , chat_id : i64 , text : & str ) -> Result < i64 > {
59+ pub async fn send_text ( & mut self , chat_id : i64 , text : & str , parse_mode : & str ) -> Result < i64 > {
4160 let peer_ref = self . resolve_peer_ref ( chat_id) . await ?;
61+ let input_msg = match parse_mode {
62+ "markdown" => InputMessage :: new ( ) . markdown ( text) ,
63+ "html" => InputMessage :: new ( ) . html ( text) ,
64+ _ => InputMessage :: new ( ) . text ( text) ,
65+ } ;
4266 let msg = self
4367 . tg
4468 . client
45- . send_message ( peer_ref, InputMessage :: new ( ) . text ( text ) )
69+ . send_message ( peer_ref, input_msg )
4670 . await
4771 . context_send ( chat_id) ?;
4872
@@ -78,12 +102,14 @@ impl App {
78102 chat_id : i64 ,
79103 text : & str ,
80104 schedule_time : chrono:: DateTime < Utc > ,
105+ parse_mode : & str ,
81106 ) -> Result < i64 > {
82107 let peer_ref = self . resolve_peer_ref ( chat_id) . await ?;
83108 let input_peer: tl:: enums:: InputPeer = peer_ref. into ( ) ;
84109
85110 let random_id: i64 = rand:: rng ( ) . random ( ) ;
86111 let schedule_date = schedule_time. timestamp ( ) as i32 ;
112+ let ( message_text, entities) = apply_parse_mode ( text, parse_mode) ;
87113
88114 let request = tl:: functions:: messages:: SendMessage {
89115 no_webpage : true ,
@@ -96,10 +122,10 @@ impl App {
96122 allow_paid_floodskip : false ,
97123 peer : input_peer,
98124 reply_to : None ,
99- message : text . to_string ( ) ,
125+ message : message_text ,
100126 random_id,
101127 reply_markup : None ,
102- entities : None ,
128+ entities,
103129 schedule_date : Some ( schedule_date) ,
104130 send_as : None ,
105131 quick_reply_shortcut : None ,
@@ -128,11 +154,13 @@ impl App {
128154 chat_id : i64 ,
129155 text : & str ,
130156 reply_to_msg_id : i32 ,
157+ parse_mode : & str ,
131158 ) -> Result < i64 > {
132159 let peer_ref = self . resolve_peer_ref ( chat_id) . await ?;
133160 let input_peer: tl:: enums:: InputPeer = peer_ref. into ( ) ;
134161
135162 let random_id: i64 = rand:: rng ( ) . random ( ) ;
163+ let ( message_text, entities) = apply_parse_mode ( text, parse_mode) ;
136164
137165 let request = tl:: functions:: messages:: SendMessage {
138166 no_webpage : true ,
@@ -157,10 +185,10 @@ impl App {
157185 }
158186 . into ( ) ,
159187 ) ,
160- message : text . to_string ( ) ,
188+ message : message_text ,
161189 random_id,
162190 reply_markup : None ,
163- entities : None ,
191+ entities,
164192 schedule_date : None ,
165193 send_as : None ,
166194 quick_reply_shortcut : None ,
@@ -209,11 +237,13 @@ impl App {
209237 chat_id : i64 ,
210238 topic_id : i32 ,
211239 text : & str ,
240+ parse_mode : & str ,
212241 ) -> Result < i64 > {
213242 let peer_ref = self . resolve_peer_ref ( chat_id) . await ?;
214243 let input_peer: tl:: enums:: InputPeer = peer_ref. into ( ) ;
215244
216245 let random_id: i64 = rand:: rng ( ) . random ( ) ;
246+ let ( message_text, entities) = apply_parse_mode ( text, parse_mode) ;
217247
218248 let request = tl:: functions:: messages:: SendMessage {
219249 no_webpage : true ,
@@ -238,10 +268,10 @@ impl App {
238268 }
239269 . into ( ) ,
240270 ) ,
241- message : text . to_string ( ) ,
271+ message : message_text ,
242272 random_id,
243273 reply_markup : None ,
244- entities : None ,
274+ entities,
245275 schedule_date : None ,
246276 send_as : None ,
247277 quick_reply_shortcut : None ,
0 commit comments