chat_member_updates/
chat_member_updates.rs1use teloxide::{prelude::*, types::ParseMode, utils::html};
2use teloxide_core::adaptors::DefaultParseMode;
3
4type Bot = DefaultParseMode<teloxide::Bot>;
14
15#[tokio::main]
16async fn main() -> ResponseResult<()> {
17 pretty_env_logger::init();
18
19 let bot = teloxide::Bot::from_env().parse_mode(ParseMode::Html);
22
23 let handler = dptree::entry()
25 .inspect(|u: Update| {
26 eprintln!("{u:#?}"); })
28 .branch(
29 Update::filter_chat_member()
30 .branch(
31 dptree::filter(|m: ChatMemberUpdated| {
32 m.old_chat_member.is_left() && m.new_chat_member.is_present()
33 })
34 .endpoint(new_chat_member),
35 )
36 .branch(
37 dptree::filter(|m: ChatMemberUpdated| {
38 m.old_chat_member.is_present() && m.new_chat_member.is_left()
39 })
40 .endpoint(left_chat_member),
41 ),
42 );
43
44 Dispatcher::builder(bot, handler).enable_ctrlc_handler().build().dispatch().await;
46
47 Ok(())
48}
49
50async fn new_chat_member(bot: Bot, chat_member: ChatMemberUpdated) -> ResponseResult<()> {
52 let user = chat_member.old_chat_member.user.clone();
53
54 let telegram_group_name = chat_member.chat.title().unwrap_or("");
55
56 let username =
60 user.mention().unwrap_or_else(|| html::user_mention(user.id, user.full_name().as_str()));
61
62 bot.send_message(chat_member.chat.id, format!("Welcome to {telegram_group_name} {username}!"))
63 .await?;
64
65 Ok(())
66}
67
68async fn left_chat_member(bot: Bot, chat_member: ChatMemberUpdated) -> ResponseResult<()> {
69 let user = chat_member.old_chat_member.user;
70
71 let username =
72 user.mention().unwrap_or_else(|| html::user_mention(user.id, user.full_name().as_str()));
73
74 bot.send_message(chat_member.chat.id, format!("Goodbye {username}!")).await?;
75
76 Ok(())
77}