1use futures::stream::{self, Stream, StreamExt};
5
6use crate::{prelude::*, types::*};
7
8pub trait BotMessagesExt: Requester {
12 fn forward<C>(&self, to_chat_id: C, message: &Message) -> Self::ForwardMessage
18 where
19 C: Into<Recipient>;
20
21 fn edit_live_location(
27 &self,
28 message: &Message,
29 latitude: f64,
30 longitude: f64,
31 ) -> Self::EditMessageLiveLocation;
32
33 fn stop_live_location(&self, message: &Message) -> Self::StopMessageLiveLocation;
39
40 fn set_reaction(&self, message: &Message) -> Self::SetMessageReaction;
46
47 fn pin(&self, message: &Message) -> Self::PinChatMessage;
53
54 fn unpin(&self, message: &Message) -> Self::UnpinChatMessage;
60
61 fn edit_text<T>(&self, message: &Message, text: T) -> Self::EditMessageText
67 where
68 T: Into<String>;
69
70 fn edit_caption(&self, message: &Message) -> Self::EditMessageCaption;
76
77 fn edit_media(&self, message: &Message, media: InputMedia) -> Self::EditMessageMedia;
83
84 fn edit_reply_markup(&self, message: &Message) -> Self::EditMessageReplyMarkup;
90
91 fn stop_poll_message(&self, message: &Message) -> Self::StopPoll;
97
98 fn delete(&self, message: &Message) -> Self::DeleteMessage;
104
105 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}