diff --git a/telebot/apihelper.py b/telebot/apihelper.py index f72ce79..b77515e 100644 --- a/telebot/apihelper.py +++ b/telebot/apihelper.py @@ -544,6 +544,19 @@ def get_game_high_scores(token, user_id, chat_id=None, message_id=None, inline_m payload['inline_message_id'] = inline_message_id return _make_request(token, method_url, params=payload) +# Payments (https://core.telegram.org/bots/api#payments) + +def send_invoice(): + # TODO + pass + +def answer_shippingQuery(): + # TODO + pass + +def answer_pre_checkout_query(): + # TODO + pass # InlineQuery diff --git a/telebot/types.py b/telebot/types.py index 475824a..1fe66de 100644 --- a/telebot/types.py +++ b/telebot/types.py @@ -148,9 +148,11 @@ class WebhookInfo(JsonDeserializable): max_connections = obj['max_connections'] if 'allowed_updates' in obj: allowed_updates = obj['allowed_updates'] - return cls(url, has_custom_certificate, pending_update_count, last_error_date, last_error_message, max_connections, allowed_updates) + return cls(url, has_custom_certificate, pending_update_count, last_error_date, last_error_message, + max_connections, allowed_updates) - def __init__(self, url, has_custom_certificate, pending_update_count, last_error_date, last_error_message, max_connections, allowed_updates): + def __init__(self, url, has_custom_certificate, pending_update_count, last_error_date, last_error_message, + max_connections, allowed_updates): self.url = url self.has_custom_certificate = has_custom_certificate self.pending_update_count = pending_update_count @@ -1608,3 +1610,167 @@ class GameHighScore(JsonDeserializable): self.position = position self.user = user self.score = score + + +# Payments + +class LabeledPrice(JsonSerializable): + def __init__(self, label, amount): + self.label = label + self.amount = amount + + def to_json(self): + return json.dumps(self.to_dic()) + + def to_dic(self): + return {'label': self.label, 'amount': self.amount} + + +class Invoice(JsonDeserializable): + @classmethod + def de_json(cls, json_string): + obj = cls.check_json(json_string) + title = obj['title'] + description = obj['description'] + start_parameter = obj['start_parameter'] + currency = obj['currency'] + total_amount = obj['total_amount'] + return cls(title, description, start_parameter, currency, total_amount) + + def __init__(self, title, description, start_parameter, currency, total_amount): + self.title = title + self.description = description + self.start_parameter = start_parameter + self.currency = currency + self.total_amount = total_amount + + +class ShippingAddress(JsonDeserializable): + @classmethod + def de_json(cls, json_string): + obj = cls.check_json(json_string) + country_code = obj['country_code'] + state = obj['state'] + city = obj['city'] + street_line1 = obj['street_line1'] + street_line2 = obj['street_line2'] + post_code = obj['post_code'] + return cls(country_code, state, city, street_line1, street_line2, post_code) + + def __init__(self, country_code, state, city, street_line1, street_line2, post_code): + self.country_code = country_code + self.state = state + self.city = city + self.street_line1 = street_line1 + self.street_line2 = street_line2 + self.post_code = post_code + + +class OrderInfo(JsonDeserializable): + @classmethod + def de_json(cls, json_string): + obj = cls.check_json(json_string) + name = obj.get('name') + phone_number = obj.get('phone_number') + email = obj.get('email') + shipping_address = None + if 'shipping_address' in obj: + shipping_address = ShippingAddress.de_json(obj['shipping_address']) + return cls(name, phone_number, email, shipping_address) + + def __init__(self, name, phone_number, email, shipping_address): + self.name = name + self.phone_number = phone_number + self.email = email + self.shipping_address = shipping_address + + +class ShippingOption(JsonSerializable): + def __init__(self, id, title): + self.id = id + self.title = title + self.prices = [] + + def add_price(self, *args): + """ + Add LabeledPrice to ShippingOption + :param args: LabeledPrices + """ + for price in args: + self.prices.append(price) + + def to_json(self): + price_list = [] + for p in self.prices: + price_list.append(p.to_dic()) + json_dict = {'id': self.id, 'title': self.title, 'prices': price_list} + return json_dict + + +class SuccessfulPayment(JsonDeserializable): + @classmethod + def de_json(cls, json_string): + obj = cls.check_json(json_string) + currency = obj['currency'] + total_amount = obj['total_amount'] + invoice_payload = obj['invoice_payload'] + shipping_option_id = obj.get('shipping_option_id') + order_info = None + if 'order_info' in obj: + order_info = OrderInfo.de_json(obj['order_info']) + telegram_payment_charge_id = obj['telegram_payment_charge_id'] + provider_payment_charge_id = obj['provider_payment_charge_id'] + return cls(currency, total_amount, invoice_payload, shipping_option_id, order_info, + telegram_payment_charge_id, provider_payment_charge_id) + + def __init__(self, currency, total_amount, invoice_payload, shipping_option_id, order_info, + telegram_payment_charge_id, provider_payment_charge_id): + self.currency = currency + self.total_amount = total_amount + self.invoice_payload = invoice_payload + self.shipping_option_id = shipping_option_id + self.order_info = order_info + self.telegram_payment_charge_id = telegram_payment_charge_id + self.provider_payment_charge_id = provider_payment_charge_id + + +class ShippingQuery(JsonDeserializable): + @classmethod + def de_json(cls, json_string): + obj = cls.check_json(json_string) + id = obj['id'] + from_user = User.de_json(obj['from']) + invoice_payload = obj['invoice_payload'] + shipping_address = ShippingAddress.de_json(obj['shipping_address']) + return cls(id, from_user, invoice_payload, shipping_address) + + def __init__(self, id, from_user, invoice_payload, shipping_address): + self.id = id + self.from_user = from_user + self.invoice_payload = invoice_payload + self.shipping_address = shipping_address + + +class PreCheckoutQuery(JsonDeserializable): + @classmethod + def de_json(cls, json_string): + obj = cls.check_json(json_string) + id = obj['id'] + from_user = User.de_json(obj['from']) + currency = obj['currency'] + total_amount = obj['total_amount'] + invoice_payload = obj['invoice_payload'] + shipping_option_id = obj.get('shipping_option_id') + order_info = None + if 'order_info' in obj: + order_info = OrderInfo.de_json(obj['order_info']) + return cls(id, from_user, currency, total_amount, invoice_payload, shipping_option_id, order_info) + + def __init__(self, id, from_user, currency, total_amount, invoice_payload, shipping_option_id, order_info): + self.id = id + self.from_user = from_user + self.currency = currency + self.total_amount = total_amount + self.invoice_payload = invoice_payload + self.shipping_option_id = shipping_option_id + self.order_info = order_info