teloxide/sugar/
bot.rs

1//! Additions to [`Bot`].
2//!
3//! [`Bot`]: crate::Bot
4use futures::stream::{self, Stream, StreamExt};
5
6use crate::{prelude::*, types::*};
7
8/// Syntax sugar for [`Message`] manipulations.
9///
10/// [`Message`]: crate::types::Message
11pub trait BotMessagesExt: Requester {
12    /// This function is the same as [`Bot::forward_message`],
13    /// but can take in [`Message`] to forward it.
14    ///
15    /// [`Bot::forward_message`]: crate::Bot::forward_message
16    /// [`Message`]: crate::types::Message
17    fn forward<C>(&self, to_chat_id: C, message: &Message) -> Self::ForwardMessage
18    where
19        C: Into<Recipient>;
20
21    /// This function is the same as [`Bot::edit_message_live_location`],
22    /// but can take in [`Message`] to edit it.
23    ///
24    /// [`Bot::edit_message_live_location`]: crate::Bot::edit_message_live_location
25    /// [`Message`]: crate::types::Message
26    fn edit_live_location(
27        &self,
28        message: &Message,
29        latitude: f64,
30        longitude: f64,
31    ) -> Self::EditMessageLiveLocation;
32
33    /// This function is the same as [`Bot::stop_message_live_location`],
34    /// but can take in [`Message`] to stop the live location in it.
35    ///
36    /// [`Bot::stop_message_live_location`]: crate::Bot::stop_message_live_location
37    /// [`Message`]: crate::types::Message
38    fn stop_live_location(&self, message: &Message) -> Self::StopMessageLiveLocation;
39
40    /// This function is the same as [`Bot::set_message_reaction`],
41    /// but can take in [`Message`] to set a reaction on it.
42    ///
43    /// [`Bot::set_message_reaction`]: crate::Bot::set_message_reaction
44    /// [`Message`]: crate::types::Message
45    fn set_reaction(&self, message: &Message) -> Self::SetMessageReaction;
46
47    /// This function is the same as [`Bot::pin_chat_message`],
48    /// but can take in [`Message`] to pin it.
49    ///
50    /// [`Bot::pin_chat_message`]: crate::Bot::pin_chat_message
51    /// [`Message`]: crate::types::Message
52    fn pin(&self, message: &Message) -> Self::PinChatMessage;
53
54    /// This function is the same as [`Bot::unpin_chat_message`],
55    /// but can take in [`Message`] to unpin it.
56    ///
57    /// [`Bot::unpin_chat_message`]: crate::Bot::unpin_chat_message
58    /// [`Message`]: crate::types::Message
59    fn unpin(&self, message: &Message) -> Self::UnpinChatMessage;
60
61    /// This function is the same as [`Bot::edit_message_text`],
62    /// but can take in [`Message`] to edit it.
63    ///
64    /// [`Bot::edit_message_text`]: crate::Bot::edit_message_text
65    /// [`Message`]: crate::types::Message
66    fn edit_text<T>(&self, message: &Message, text: T) -> Self::EditMessageText
67    where
68        T: Into<String>;
69
70    /// This function is the same as [`Bot::edit_message_caption`],
71    /// but can take in [`Message`] to edit it.
72    ///
73    /// [`Bot::edit_message_caption`]: crate::Bot::edit_message_caption
74    /// [`Message`]: crate::types::Message
75    fn edit_caption(&self, message: &Message) -> Self::EditMessageCaption;
76
77    /// This function is the same as [`Bot::edit_message_media`],
78    /// but can take in [`Message`] to edit it.
79    ///
80    /// [`Bot::edit_message_media`]: crate::Bot::edit_message_media
81    /// [`Message`]: crate::types::Message
82    fn edit_media(&self, message: &Message, media: InputMedia) -> Self::EditMessageMedia;
83
84    /// This function is the same as [`Bot::edit_message_reply_markup`],
85    /// but can take in [`Message`] to edit it.
86    ///
87    /// [`Bot::edit_message_reply_markup`]: crate::Bot::edit_message_reply_markup
88    /// [`Message`]: crate::types::Message
89    fn edit_reply_markup(&self, message: &Message) -> Self::EditMessageReplyMarkup;
90
91    /// This function is the same as [`Bot::stop_poll`],
92    /// but can take in [`Message`] to stop the poll in it.
93    ///
94    /// [`Bot::stop_poll`]: crate::Bot::stop_poll
95    /// [`Message`]: crate::types::Message
96    fn stop_poll_message(&self, message: &Message) -> Self::StopPoll;
97
98    /// This function is the same as [`Bot::delete_message`],
99    /// but can take in [`Message`] to delete it.
100    ///
101    /// [`Bot::delete_message`]: crate::Bot::delete_message
102    /// [`Message`]: crate::types::Message
103    fn delete(&self, message: &Message) -> Self::DeleteMessage;
104
105    /// This function is the same as [`Bot::copy_message`],
106    /// but can take in [`Message`] to copy it.
107    ///
108    /// [`Bot::copy_messages`]: crate::Bot::copy_message
109    /// [`Message`]: crate::types::Message
110    fn copy<C>(&self, to_chat_id: C, message: &Message) -> Self::CopyMessage
111    where
112        C: Into<Recipient>;
113
114    fn iter_star_transactions(&self) -> impl Stream<Item = StarTransaction>;
115}
116
117impl<R> BotMessagesExt for R
118where
119    R: Requester,
120{
121    fn forward<C>(&self, to_chat_id: C, message: &Message) -> Self::ForwardMessage
122    where
123        C: Into<Recipient>,
124    {
125        self.forward_message(to_chat_id, message.chat.id, message.id)
126    }
127
128    fn edit_live_location(
129        &self,
130        message: &Message,
131        latitude: f64,
132        longitude: f64,
133    ) -> Self::EditMessageLiveLocation {
134        self.edit_message_live_location(message.chat.id, message.id, latitude, longitude)
135    }
136
137    fn stop_live_location(&self, message: &Message) -> Self::StopMessageLiveLocation {
138        self.stop_message_live_location(message.chat.id, message.id)
139    }
140
141    fn set_reaction(&self, message: &Message) -> Self::SetMessageReaction {
142        self.set_message_reaction(message.chat.id, message.id)
143    }
144
145    fn pin(&self, message: &Message) -> Self::PinChatMessage {
146        self.pin_chat_message(message.chat.id, message.id)
147    }
148
149    fn unpin(&self, message: &Message) -> Self::UnpinChatMessage {
150        self.unpin_chat_message(message.chat.id).message_id(message.id)
151    }
152
153    fn edit_text<T>(&self, message: &Message, text: T) -> Self::EditMessageText
154    where
155        T: Into<String>,
156    {
157        self.edit_message_text(message.chat.id, message.id, text)
158    }
159
160    fn edit_caption(&self, message: &Message) -> Self::EditMessageCaption {
161        self.edit_message_caption(message.chat.id, message.id)
162    }
163
164    fn edit_media(&self, message: &Message, media: InputMedia) -> Self::EditMessageMedia {
165        self.edit_message_media(message.chat.id, message.id, media)
166    }
167
168    fn edit_reply_markup(&self, message: &Message) -> Self::EditMessageReplyMarkup {
169        self.edit_message_reply_markup(message.chat.id, message.id)
170    }
171
172    fn stop_poll_message(&self, message: &Message) -> Self::StopPoll {
173        self.stop_poll(message.chat.id, message.id)
174    }
175
176    fn delete(&self, message: &Message) -> Self::DeleteMessage {
177        self.delete_message(message.chat.id, message.id)
178    }
179
180    fn copy<C>(&self, to_chat_id: C, message: &Message) -> Self::CopyMessage
181    where
182        C: Into<Recipient>,
183    {
184        self.copy_message(to_chat_id, message.chat.id, message.id)
185    }
186
187    fn iter_star_transactions(&self) -> impl Stream<Item = StarTransaction> {
188        stream::unfold(0, move |state| async move {
189            let transactions: Result<StarTransactions, <R as Requester>::Err> =
190                self.get_star_transactions().offset(state).await;
191
192            match transactions {
193                Ok(transactions) => Some((stream::iter(transactions.transactions), state + 100)),
194                Err(_) => None,
195            }
196        })
197        .flatten()
198    }
199}