telegram_bot/util/
messages.rs

1//! Utility traits that extends [`telegram_bot_raw::types::message`]
2//!
3//! [`telegram_bot_raw::types::message`]: ../../telegram_bot_raw/types/message/index.html
4
5use crate::prelude::CanGetFile;
6use crate::types::{
7    requests::get_file::GetFile, ChannelPost, Message, MessageKind, MessageOrChannelPost,
8};
9
10/// A trait to obtain text from a message.
11///
12/// For example, this will return the text from text messages, or the caption of a photo.
13pub trait MessageText {
14    /// Obtain text from a message if available.
15    fn text<'a>(&'a self) -> Option<String>;
16}
17
18impl MessageText for MessageOrChannelPost {
19    fn text<'a>(&'a self) -> Option<String> {
20        match self {
21            MessageOrChannelPost::Message(msg) => msg.text(),
22            MessageOrChannelPost::ChannelPost(post) => post.text(),
23        }
24    }
25}
26
27impl MessageText for Message {
28    fn text<'a>(&'a self) -> Option<String> {
29        self.kind.text()
30    }
31}
32
33impl MessageText for MessageKind {
34    fn text<'a>(&'a self) -> Option<String> {
35        match self {
36            MessageKind::Text { data, .. } => Some(data.to_owned()),
37            MessageKind::Audio { data } => data.title.to_owned(),
38            MessageKind::Document { data, caption } => {
39                caption.clone().or_else(|| data.file_name.clone())
40            }
41            MessageKind::Photo { caption, .. } => caption.to_owned(),
42            MessageKind::Sticker { .. } => None,
43            MessageKind::Video { caption, .. } => caption.to_owned(),
44            MessageKind::Voice { .. } => None,
45            MessageKind::VideoNote { .. } => None,
46            MessageKind::Contact { data } => Some(data.first_name.to_owned()),
47            MessageKind::Location { .. } => None,
48            MessageKind::Poll { data } => Some(data.question.to_owned()),
49            MessageKind::Venue { data } => Some(data.title.to_owned()),
50            MessageKind::NewChatMembers { .. } => None,
51            MessageKind::LeftChatMember { .. } => None,
52            MessageKind::NewChatTitle { data } => Some(data.to_owned()),
53            MessageKind::NewChatPhoto { .. } => None,
54            MessageKind::DeleteChatPhoto => None,
55            MessageKind::GroupChatCreated => None,
56            MessageKind::SupergroupChatCreated => None,
57            MessageKind::ChannelChatCreated => None,
58            MessageKind::MigrateToChatId { .. } => None,
59            MessageKind::MigrateFromChatId { .. } => None,
60            MessageKind::PinnedMessage { data } => data.text(),
61            MessageKind::Unknown { .. } => None,
62        }
63    }
64}
65
66impl MessageText for ChannelPost {
67    fn text<'a>(&'a self) -> Option<String> {
68        self.kind.text()
69    }
70}
71
72/// A trait to obtain `GetFile` requests from a message.
73///
74/// Many message kinds such as `Sticker` return a single `GetFile`.
75/// Message kinds like `Photo` might return more if an album is posted.
76/// A video, video note or document returns any thumbnail as well.
77pub trait MessageGetFiles {
78    /// Obtain files from a message if available.
79    fn get_files<'a>(&'a self) -> Option<Vec<GetFile>>;
80}
81
82impl MessageGetFiles for MessageOrChannelPost {
83    fn get_files<'a>(&'a self) -> Option<Vec<GetFile>> {
84        match self {
85            MessageOrChannelPost::Message(msg) => msg.get_files(),
86            MessageOrChannelPost::ChannelPost(post) => post.get_files(),
87        }
88    }
89}
90
91impl MessageGetFiles for Message {
92    fn get_files<'a>(&'a self) -> Option<Vec<GetFile>> {
93        self.kind.get_files()
94    }
95}
96
97impl MessageGetFiles for MessageKind {
98    fn get_files<'a>(&'a self) -> Option<Vec<GetFile>> {
99        match self {
100            MessageKind::Text { .. } => None,
101            MessageKind::Audio { data } => Some(vec![data.get_file()]),
102            MessageKind::Document { data, .. } => {
103                let mut files = vec![data.get_file()];
104                if let Some(thumb) = &data.thumb {
105                    files.push(thumb.get_file());
106                }
107                Some(files)
108            }
109            MessageKind::Photo { data, .. } => {
110                Some(data.into_iter().map(|f| f.get_file()).collect())
111            }
112            MessageKind::Sticker { data } => Some(vec![data.get_file()]),
113            MessageKind::Video { data, .. } => {
114                let mut files = vec![data.get_file()];
115                if let Some(thumb) = &data.thumb {
116                    files.push(thumb.get_file());
117                }
118                Some(files)
119            }
120            MessageKind::Voice { data } => Some(vec![data.get_file()]),
121            MessageKind::VideoNote { data, .. } => {
122                let mut files = vec![data.get_file()];
123                if let Some(thumb) = &data.thumb {
124                    files.push(thumb.get_file());
125                }
126                Some(files)
127            }
128            MessageKind::Contact { .. } => None,
129            MessageKind::Location { .. } => None,
130            MessageKind::Poll { .. } => None,
131            MessageKind::Venue { .. } => None,
132            MessageKind::NewChatMembers { .. } => None,
133            MessageKind::LeftChatMember { .. } => None,
134            MessageKind::NewChatTitle { .. } => None,
135            MessageKind::NewChatPhoto { data } => {
136                Some(data.into_iter().map(|f| f.get_file()).collect())
137            }
138            MessageKind::DeleteChatPhoto => None,
139            MessageKind::GroupChatCreated => None,
140            MessageKind::SupergroupChatCreated => None,
141            MessageKind::ChannelChatCreated => None,
142            MessageKind::MigrateToChatId { .. } => None,
143            MessageKind::MigrateFromChatId { .. } => None,
144            MessageKind::PinnedMessage { .. } => None,
145            MessageKind::Unknown { .. } => None,
146        }
147    }
148}
149
150impl MessageGetFiles for ChannelPost {
151    fn get_files<'a>(&'a self) -> Option<Vec<GetFile>> {
152        self.kind.get_files()
153    }
154}