Skip to content

Commit cc47f38

Browse files
authored
Merge pull request #2 from smcllns/main
Rename download --output to --dest to fix arg collision
2 parents 6956664 + 2724873 commit cc47f38

5 files changed

Lines changed: 230 additions & 16 deletions

File tree

Cargo.lock

Lines changed: 166 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ name = "tgcli"
1616
path = "src/main.rs"
1717

1818
[dependencies]
19-
grammers-client = { version = "0.8", features = ["fs"] }
19+
grammers-client = { version = "0.8", features = ["fs", "markdown", "html"] }
2020
grammers-session = "0.8"
2121
grammers-tl-types = "0.8"
2222
grammers-mtsender = "0.8"

src/app/send.rs

Lines changed: 38 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use crate::store::UpsertMessageParams;
44
use anyhow::{Context, Result};
55
use base64::{engine::general_purpose::URL_SAFE_NO_PAD, Engine as _};
66
use chrono::Utc;
7+
use grammers_client::parsers::{parse_html_message, parse_markdown_message};
78
use grammers_client::types::Attribute;
89
use grammers_client::InputMessage;
910
use grammers_session::defs::PeerRef;
@@ -13,6 +14,24 @@ use std::path::Path;
1314
use std::time::Duration;
1415
use 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)]
1837
pub struct SearchChatResult {
@@ -37,12 +56,17 @@ fn decode_file_id(file_id: &str) -> Result<(i64, i64, Vec<u8>)> {
3756

3857
impl 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

Comments
 (0)