From 39c497ca1e94ac0f4f777177f69a6d7b2b97e070 Mon Sep 17 00:00:00 2001
From: Waffle <waffle.lapkin@gmail.com>
Date: Tue, 4 May 2021 16:47:16 +0300
Subject: [PATCH] Update methods to TBA 5.2

---
 src/adaptors/throttle.rs     | 40 +-----------------------------------
 src/bot/api.rs               |  8 +++-----
 src/local_macros.rs          |  6 +++---
 src/payloads/send_invoice.rs | 14 +++++++++----
 src/requests/requester.rs    |  8 +++-----
 5 files changed, 20 insertions(+), 56 deletions(-)

diff --git a/src/adaptors/throttle.rs b/src/adaptors/throttle.rs
index 74149fdb..0f275758 100644
--- a/src/adaptors/throttle.rs
+++ b/src/adaptors/throttle.rs
@@ -411,45 +411,7 @@ where
         send_message, forward_message, copy_message, send_photo, send_audio,
         send_document, send_video, send_animation, send_voice, send_video_note,
         send_media_group, send_location, send_venue, send_contact, send_poll,
-        send_dice, send_sticker,  => f, fty
-    }
-
-    type SendInvoice = ThrottlingRequest<B::SendInvoice>;
-
-    fn send_invoice<T, D, Pa, P, S, C, Pri>(
-        &self,
-        chat_id: i32,
-        title: T,
-        description: D,
-        payload: Pa,
-        provider_token: P,
-        start_parameter: S,
-        currency: C,
-        prices: Pri,
-    ) -> Self::SendInvoice
-    where
-        T: Into<String>,
-        D: Into<String>,
-        Pa: Into<String>,
-        P: Into<String>,
-        S: Into<String>,
-        C: Into<String>,
-        Pri: IntoIterator<Item = LabeledPrice>,
-    {
-        ThrottlingRequest {
-            request: self.inner().send_invoice(
-                chat_id,
-                title,
-                description,
-                payload,
-                provider_token,
-                start_parameter,
-                currency,
-                prices,
-            ),
-            chat_id: |p| ChatIdHash::Id(p.payload_ref().chat_id as _),
-            worker: self.queue.clone(),
-        }
+        send_dice, send_sticker, send_invoice => f, fty
     }
 
     requester_forward! {
diff --git a/src/bot/api.rs b/src/bot/api.rs
index 35b5da58..f0e95786 100644
--- a/src/bot/api.rs
+++ b/src/bot/api.rs
@@ -875,23 +875,22 @@ impl Requester for Bot {
 
     type SendInvoice = JsonRequest<payloads::SendInvoice>;
 
-    fn send_invoice<T, D, Pa, P, S, C, Pri>(
+    fn send_invoice<Ch, T, D, Pa, P, C, Pri>(
         &self,
-        chat_id: i32,
+        chat_id: Ch,
         title: T,
         description: D,
         payload: Pa,
         provider_token: P,
-        start_parameter: S,
         currency: C,
         prices: Pri,
     ) -> Self::SendInvoice
     where
+        Ch: Into<ChatId>,
         T: Into<String>,
         D: Into<String>,
         Pa: Into<String>,
         P: Into<String>,
-        S: Into<String>,
         C: Into<String>,
         Pri: IntoIterator<Item = LabeledPrice>,
     {
@@ -903,7 +902,6 @@ impl Requester for Bot {
                 description,
                 payload,
                 provider_token,
-                start_parameter,
                 currency,
                 prices,
             ),
diff --git a/src/local_macros.rs b/src/local_macros.rs
index 68c746a7..0875949e 100644
--- a/src/local_macros.rs
+++ b/src/local_macros.rs
@@ -1040,15 +1040,15 @@ macro_rules! requester_forward {
     (@method send_invoice $body:ident $ty:ident) => {
         type SendInvoice = $ty![SendInvoice];
 
-        fn send_invoice<T, D, Pa, P, S, C, Pri>(&self, chat_id: i32, title: T, description: D, payload: Pa, provider_token: P, start_parameter: S, currency: C, prices: Pri) -> Self::SendInvoice where T: Into<String>,
+        fn send_invoice<Ch, T, D, Pa, P, C, Pri>(&self, chat_id: Ch, title: T, description: D, payload: Pa, provider_token: P, currency: C, prices: Pri) -> Self::SendInvoice where Ch: Into<ChatId>,
+        T: Into<String>,
         D: Into<String>,
         Pa: Into<String>,
         P: Into<String>,
-        S: Into<String>,
         C: Into<String>,
         Pri: IntoIterator<Item = LabeledPrice> {
             let this = self;
-            $body!(send_invoice this (chat_id: i32, title: T, description: D, payload: Pa, provider_token: P, start_parameter: S, currency: C, prices: Pri))
+            $body!(send_invoice this (chat_id: Ch, title: T, description: D, payload: Pa, provider_token: P, currency: C, prices: Pri))
         }
     };
     (@method answer_shipping_query $body:ident $ty:ident) => {
diff --git a/src/payloads/send_invoice.rs b/src/payloads/send_invoice.rs
index 4573633b..5a166f28 100644
--- a/src/payloads/send_invoice.rs
+++ b/src/payloads/send_invoice.rs
@@ -8,7 +8,7 @@
 // [`schema`]: https://github.com/WaffleLapkin/tg-methods-schema
 use serde::Serialize;
 
-use crate::types::{InlineKeyboardMarkup, LabeledPrice, Message};
+use crate::types::{ChatId, InlineKeyboardMarkup, LabeledPrice, Message};
 
 impl_payload! {
     /// Use this method to send invoices. On success, the sent [`Message`] is returned.
@@ -18,7 +18,7 @@ impl_payload! {
     pub SendInvoice (SendInvoiceSetters) => Message {
         required {
             /// Unique identifier for the target private chat
-            pub chat_id: i32,
+            pub chat_id: ChatId [into],
             /// Product name, 1-32 characters
             pub title: String [into],
             /// Product description, 1-255 characters
@@ -29,14 +29,20 @@ impl_payload! {
             ///
             /// [Botfather]: https://t.me/botfather
             pub provider_token: String [into],
-            /// Unique deep-linking parameter that can be used to generate this invoice when used as a start parameter
-            pub start_parameter: String [into],
             /// Three-letter ISO 4217 currency code, see more on currencies
             pub currency: String [into],
             /// Price breakdown, a JSON-serialized list of components (e.g. product price, tax, discount, delivery cost, delivery tax, bonus, etc.)
             pub prices: Vec<LabeledPrice> [collect],
         }
         optional {
+            /// The maximum accepted amount for tips in the smallest units of the currency (integer, **not** float/double). For example, for a maximum tip of `US$ 1.45` pass `max_tip_amount = 145`. See the exp parameter in [`currencies.json`], it shows the number of digits past the decimal point for each currency (2 for the majority of currencies). Defaults to 0
+            ///
+            /// [`currencies.json`]: https://core.telegram.org/bots/payments/currencies.json
+            pub max_tip_amount: u32,
+            /// A JSON-serialized array of suggested amounts of tips in the smallest units of the currency (integer, **not** float/double). At most 4 suggested tip amounts can be specified. The suggested tip amounts must be positive, passed in a strictly increased order and must not exceed _max_tip_amount_.
+            pub suggested_tip_amounts: Vec<u32> [collect],
+            /// Unique deep-linking parameter. If left empty, **forwarded copies** of the sent message will have a Pay button, allowing multiple users to pay directly from the forwarded message, using the same invoice. If non-empty, forwarded copies of the sent message will have a URL button with a deep link to the bot (instead of a Pay button), with the value used as the start parameter
+            pub start_parameter: String [into],
             /// A JSON-serialized data about the invoice, which will be shared with the payment provider. A detailed description of required fields should be provided by the payment provider.
             pub provider_data: String [into],
             /// URL of the product photo for the invoice. Can be a photo of the goods or a marketing image for a service. People like it better when they see what they are paying for.
diff --git a/src/requests/requester.rs b/src/requests/requester.rs
index c6689ef8..d4a0fe12 100644
--- a/src/requests/requester.rs
+++ b/src/requests/requester.rs
@@ -60,7 +60,6 @@ pub trait Requester {
     //
     // [cg]: https://github.com/teloxide/cg
     // [`schema`]: https://github.com/WaffleLapkin/tg-methods-schema
-
     type GetUpdates: Request<Payload = GetUpdates, Err = Self::Err>;
 
     /// For Telegram documentation see [`GetUpdates`].
@@ -723,23 +722,22 @@ pub trait Requester {
     type SendInvoice: Request<Payload = SendInvoice, Err = Self::Err>;
 
     /// For Telegram documentation see [`SendInvoice`].
-    fn send_invoice<T, D, Pa, P, S, C, Pri>(
+    fn send_invoice<Ch, T, D, Pa, P, C, Pri>(
         &self,
-        chat_id: i32,
+        chat_id: Ch,
         title: T,
         description: D,
         payload: Pa,
         provider_token: P,
-        start_parameter: S,
         currency: C,
         prices: Pri,
     ) -> Self::SendInvoice
     where
+        Ch: Into<ChatId>,
         T: Into<String>,
         D: Into<String>,
         Pa: Into<String>,
         P: Into<String>,
-        S: Into<String>,
         C: Into<String>,
         Pri: IntoIterator<Item = LabeledPrice>;