diff --git a/compiler/docs/compiler.py b/compiler/docs/compiler.py index 20e0dd25..c78a47ee 100644 --- a/compiler/docs/compiler.py +++ b/compiler/docs/compiler.py @@ -366,6 +366,7 @@ def pyrogram_api(): InlineQueryResultArticle InlineQueryResultPhoto InlineQueryResultAnimation + ChosenInlineResult """, input_message_content=""" InputMessageContent diff --git a/compiler/docs/template/bound-methods.rst b/compiler/docs/template/bound-methods.rst index 0057e071..4238df52 100644 --- a/compiler/docs/template/bound-methods.rst +++ b/compiler/docs/template/bound-methods.rst @@ -20,6 +20,12 @@ some of the required arguments. app.run() +.. contents:: Contents + :backlinks: none + :local: + +----- + .. currentmodule:: pyrogram Message diff --git a/compiler/docs/template/methods.rst b/compiler/docs/template/methods.rst index a0c6df92..5a287f87 100644 --- a/compiler/docs/template/methods.rst +++ b/compiler/docs/template/methods.rst @@ -13,6 +13,12 @@ This page is about Pyrogram methods. All the methods listed here are bound to a with app: app.send_message("haskell", "hi") +.. contents:: Contents + :backlinks: none + :local: + +----- + .. currentmodule:: pyrogram.Client Utilities diff --git a/compiler/docs/template/types.rst b/compiler/docs/template/types.rst index 5c91e68f..2c79c11d 100644 --- a/compiler/docs/template/types.rst +++ b/compiler/docs/template/types.rst @@ -13,8 +13,13 @@ This page is about Pyrogram types. All types listed here are accessible through **Optional** fields may not exist when irrelevant -- i.e.: they will contain the value of ``None`` and aren't shown when, for example, using ``print()``. -.. currentmodule:: pyrogram +.. contents:: Contents + :backlinks: none + :local: +----- + +.. currentmodule:: pyrogram Users & Chats ------------- diff --git a/docs/requirements.txt b/docs/requirements.txt index 3ebe0d49..0e754f9f 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,5 +1,6 @@ sphinx sphinx_rtd_theme sphinx_copybutton +sphinx_tabs pypandoc requests \ No newline at end of file diff --git a/docs/source/api/client.rst b/docs/source/api/client.rst index d28b7f61..4190af5b 100644 --- a/docs/source/api/client.rst +++ b/docs/source/api/client.rst @@ -17,6 +17,8 @@ This page is about the Client class, which exposes high-level methods for an eas with app: app.send_message("me", "Hi!") +----- + Details ------- diff --git a/docs/source/api/decorators.rst b/docs/source/api/decorators.rst index fd397cc4..cacb43b1 100644 --- a/docs/source/api/decorators.rst +++ b/docs/source/api/decorators.rst @@ -24,6 +24,12 @@ functions. app.run() +.. contents:: Contents + :backlinks: none + :local: + +----- + .. currentmodule:: pyrogram Index @@ -35,6 +41,7 @@ Index - :meth:`~Client.on_message` - :meth:`~Client.on_callback_query` - :meth:`~Client.on_inline_query` + - :meth:`~Client.on_chosen_inline_result` - :meth:`~Client.on_deleted_messages` - :meth:`~Client.on_user_status` - :meth:`~Client.on_poll` @@ -50,6 +57,7 @@ Details .. autodecorator:: pyrogram.Client.on_message() .. autodecorator:: pyrogram.Client.on_callback_query() .. autodecorator:: pyrogram.Client.on_inline_query() +.. autodecorator:: pyrogram.Client.on_chosen_inline_result() .. autodecorator:: pyrogram.Client.on_deleted_messages() .. autodecorator:: pyrogram.Client.on_user_status() .. autodecorator:: pyrogram.Client.on_poll() diff --git a/docs/source/api/errors.rst b/docs/source/api/errors.rst index fad571e3..5c443cf3 100644 --- a/docs/source/api/errors.rst +++ b/docs/source/api/errors.rst @@ -15,6 +15,12 @@ follow the usual *PascalCase* convention. except FloodWait as e: ... +.. contents:: Contents + :backlinks: none + :local: + +----- + 303 - SeeOther -------------- diff --git a/docs/source/api/handlers.rst b/docs/source/api/handlers.rst index 1ae0961b..4fdc511e 100644 --- a/docs/source/api/handlers.rst +++ b/docs/source/api/handlers.rst @@ -20,6 +20,12 @@ For a much more convenient way of registering callback functions have a look at app.run() +.. contents:: Contents + :backlinks: none + :local: + +----- + .. currentmodule:: pyrogram Index @@ -32,6 +38,7 @@ Index - :class:`DeletedMessagesHandler` - :class:`CallbackQueryHandler` - :class:`InlineQueryHandler` + - :class:`ChosenInlineResultHandler` - :class:`UserStatusHandler` - :class:`PollHandler` - :class:`DisconnectHandler` @@ -47,6 +54,7 @@ Details .. autoclass:: DeletedMessagesHandler() .. autoclass:: CallbackQueryHandler() .. autoclass:: InlineQueryHandler() +.. autoclass:: ChosenInlineResultHandler() .. autoclass:: UserStatusHandler() .. autoclass:: PollHandler() .. autoclass:: DisconnectHandler() diff --git a/docs/source/conf.py b/docs/source/conf.py index 519a96d9..0302328d 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -35,7 +35,8 @@ extensions = [ "sphinx.ext.autodoc", "sphinx.ext.napoleon", "sphinx.ext.autosummary", - "sphinx_copybutton" + "sphinx_copybutton", + "sphinx_tabs.tabs" ] master_doc = "index" diff --git a/docs/source/faq.rst b/docs/source/faq.rst index 80df70b5..b064e10b 100644 --- a/docs/source/faq.rst +++ b/docs/source/faq.rst @@ -13,7 +13,8 @@ This FAQ page provides answers to common questions about Pyrogram and, to some e .. contents:: Contents :backlinks: none :local: - :depth: 1 + +----- What is Pyrogram? ----------------- @@ -366,6 +367,20 @@ Having said that, here's some insights about limits: - Limits vary based on methods and the arguments passed to methods. For example: log-ins are expensive and thus have stricter limits; replying to a user command could cause a flood wait in case the user starts flooding, but such limit will only be applied to that particular chat (i.e.: other users are not affected). +- You can catch Flood Wait exceptions in your code and wait the required seconds before continuing, this way: + + .. code-block:: python + + import time + from pyrogram.errors import FloodWait + + try: + ... # Your code + except FloodWait as e: + time.sleep(e.x) # Wait "x" seconds before continuing + + + More info about error handling can be found `here `_. My account has been deactivated/limited! ---------------------------------------- diff --git a/docs/source/glossary.rst b/docs/source/glossary.rst index de9d354d..a0e970ae 100644 --- a/docs/source/glossary.rst +++ b/docs/source/glossary.rst @@ -8,6 +8,11 @@ general. Some words may as well link to dedicated articles in case the topic is If you think something interesting could be added here, feel free to propose it by opening a `Feature Request`_. +.. contents:: Contents + :backlinks: none + :local: + +----- Terms ----- diff --git a/docs/source/intro/install.rst b/docs/source/intro/install.rst index edd43161..5312e44a 100644 --- a/docs/source/intro/install.rst +++ b/docs/source/intro/install.rst @@ -11,6 +11,12 @@ We recommend using the latest versions of both Python 3 and pip. Pyrogram supports **Python 3** only, starting from version 3.5.3. **PyPy** is supported too. +.. contents:: Contents + :backlinks: none + :local: + +----- + Install Pyrogram ---------------- diff --git a/docs/source/intro/setup.rst b/docs/source/intro/setup.rst index b3aa1836..f5bf607b 100644 --- a/docs/source/intro/setup.rst +++ b/docs/source/intro/setup.rst @@ -4,6 +4,12 @@ Project Setup We have just :doc:`installed Pyrogram `. In this page we'll discuss what you need to do in order to set up a project with the library. Let's see how it's done. +.. contents:: Contents + :backlinks: none + :local: + +----- + API Keys -------- diff --git a/docs/source/license.rst b/docs/source/license.rst index 43f59d73..512f2c5b 100644 --- a/docs/source/license.rst +++ b/docs/source/license.rst @@ -12,4 +12,4 @@ In other words: you can use and integrate Pyrogram into your own code --- either different license, or even proprietary --- without being required to release the source code of your own applications. However, any modifications to the library itself are required to be published for free under the same LGPLv3+ license. -.. _GNU Lesser General Public License v3 or later (LGPLv3+): https://github.com/pyrogram/pyrogram/blob/develop/COPYING.lesser \ No newline at end of file +.. _GNU Lesser General Public License v3 or later (LGPLv3+): https://github.com/pyrogram/pyrogram/blob/develop/COPYING.lesser diff --git a/docs/source/powered-by.rst b/docs/source/powered-by.rst index 4af4fc27..a696cebc 100644 --- a/docs/source/powered-by.rst +++ b/docs/source/powered-by.rst @@ -9,6 +9,12 @@ This is a collection of remarkable projects made with Pyrogram. If you'd like to propose a project that's worth being listed here, feel free to open a `Feature Request`_. +.. contents:: Contents + :backlinks: none + :local: + +----- + Projects Showcase ----------------- diff --git a/docs/source/start/auth.rst b/docs/source/start/auth.rst index ca1ddd8f..0bbd4c5e 100644 --- a/docs/source/start/auth.rst +++ b/docs/source/start/auth.rst @@ -4,6 +4,12 @@ Authorization Once a :doc:`project is set up <../intro/setup>`, you will still have to follow a few steps before you can actually use Pyrogram to make API calls. This section provides all the information you need in order to authorize yourself as user or bot. +.. contents:: Contents + :backlinks: none + :local: + +----- + User Authorization ------------------ diff --git a/docs/source/start/errors.rst b/docs/source/start/errors.rst index bd82bf73..a9707d08 100644 --- a/docs/source/start/errors.rst +++ b/docs/source/start/errors.rst @@ -8,6 +8,12 @@ to control the behaviour of your application. Pyrogram errors all live inside th from pyrogram import errors +.. contents:: Contents + :backlinks: none + :local: + +----- + RPCError -------- @@ -94,6 +100,6 @@ The value is stored in the ``x`` attribute of the exception object: from pyrogram.errors import FloodWait try: - ... + ... # Your code except FloodWait as e: time.sleep(e.x) # Wait "x" seconds before continuing diff --git a/docs/source/start/invoking.rst b/docs/source/start/invoking.rst index 5cb6817b..74b313e4 100644 --- a/docs/source/start/invoking.rst +++ b/docs/source/start/invoking.rst @@ -4,6 +4,12 @@ Calling Methods At this point, we have successfully :doc:`installed Pyrogram <../intro/install>` and :doc:`authorized ` our account; we are now aiming towards the core of the library. It's time to start playing with the API! +.. contents:: Contents + :backlinks: none + :local: + +----- + Basic Usage ----------- diff --git a/docs/source/start/updates.rst b/docs/source/start/updates.rst index 056fcb3d..4f010e27 100644 --- a/docs/source/start/updates.rst +++ b/docs/source/start/updates.rst @@ -4,6 +4,12 @@ Handling Updates Calling :doc:`API methods ` sequentially is cool, but how to react when, for example, a new message arrives? This page deals with updates and how to handle such events in Pyrogram. Let's have a look at how they work. +.. contents:: Contents + :backlinks: none + :local: + +----- + Defining Updates ---------------- diff --git a/docs/source/support-pyrogram.rst b/docs/source/support-pyrogram.rst index 81a0e533..2505585e 100644 --- a/docs/source/support-pyrogram.rst +++ b/docs/source/support-pyrogram.rst @@ -9,6 +9,8 @@ found it to be useful, give Pyrogram a `Star on GitHub`_. Your appreciation mean Star

+----- + Donate ------ diff --git a/docs/source/topics/advanced-usage.rst b/docs/source/topics/advanced-usage.rst index 1460a3d8..a56e0da1 100644 --- a/docs/source/topics/advanced-usage.rst +++ b/docs/source/topics/advanced-usage.rst @@ -8,6 +8,12 @@ Telegram API. In this section, you'll be shown the alternative way of communicating with Telegram using Pyrogram: the main "raw" Telegram API with its functions and types. +.. contents:: Contents + :backlinks: none + :local: + +----- + Telegram Raw API ---------------- diff --git a/docs/source/topics/bots-interaction.rst b/docs/source/topics/bots-interaction.rst index ad993050..97a72e05 100644 --- a/docs/source/topics/bots-interaction.rst +++ b/docs/source/topics/bots-interaction.rst @@ -3,6 +3,12 @@ Bots Interaction Users can interact with other bots via plain text messages as well as inline queries. +.. contents:: Contents + :backlinks: none + :local: + +----- + Inline Bots ----------- diff --git a/docs/source/topics/config-file.rst b/docs/source/topics/config-file.rst index a28025db..b6faee05 100644 --- a/docs/source/topics/config-file.rst +++ b/docs/source/topics/config-file.rst @@ -4,6 +4,12 @@ Configuration File As already mentioned in previous pages, Pyrogram can be configured by the use of an INI file. This page explains how this file is structured, how to use it and why. +.. contents:: Contents + :backlinks: none + :local: + +----- + Introduction ------------ diff --git a/docs/source/topics/create-filters.rst b/docs/source/topics/create-filters.rst index 6ae6e98c..060357de 100644 --- a/docs/source/topics/create-filters.rst +++ b/docs/source/topics/create-filters.rst @@ -9,6 +9,12 @@ for example) you can use :meth:`~pyrogram.Filters.create`. At the moment, the built-in filters are intended to be used with the :class:`~pyrogram.MessageHandler` only. +.. contents:: Contents + :backlinks: none + :local: + +----- + Custom Filters -------------- diff --git a/docs/source/topics/debugging.rst b/docs/source/topics/debugging.rst index 153c0927..7284884a 100644 --- a/docs/source/topics/debugging.rst +++ b/docs/source/topics/debugging.rst @@ -4,6 +4,12 @@ Debugging When working with the API, chances are you'll stumble upon bugs, get stuck and start wondering how to continue. Nothing to actually worry about -- that's normal -- and luckily for you, Pyrogram provides some commodities to help you in this. +.. contents:: Contents + :backlinks: none + :local: + +----- + Caveman Debugging ----------------- diff --git a/docs/source/topics/more-on-updates.rst b/docs/source/topics/more-on-updates.rst index f23e692e..1bffaeef 100644 --- a/docs/source/topics/more-on-updates.rst +++ b/docs/source/topics/more-on-updates.rst @@ -4,6 +4,12 @@ More on Updates Here we'll show some advanced usages when working with :doc:`update handlers <../start/updates>` and :doc:`filters `. +.. contents:: Contents + :backlinks: none + :local: + +----- + Handler Groups -------------- diff --git a/docs/source/topics/mtproto-vs-botapi.rst b/docs/source/topics/mtproto-vs-botapi.rst index b0e46a7f..3668d0da 100644 --- a/docs/source/topics/mtproto-vs-botapi.rst +++ b/docs/source/topics/mtproto-vs-botapi.rst @@ -6,6 +6,12 @@ already superior to, what is usually called, the official Bot API, in many respe why Pyrogram might be a better choice for your project by comparing the two APIs, but first, let's make it clear what actually is the MTProto and the Bot API. +.. contents:: Contents + :backlinks: none + :local: + +----- + What is the MTProto API? ------------------------ diff --git a/docs/source/topics/proxy.rst b/docs/source/topics/proxy.rst index 761899e6..cde55cc7 100644 --- a/docs/source/topics/proxy.rst +++ b/docs/source/topics/proxy.rst @@ -4,6 +4,12 @@ SOCKS5 Proxy Pyrogram supports proxies with and without authentication. This feature allows Pyrogram to exchange data with Telegram through an intermediate SOCKS5 proxy server. +.. contents:: Contents + :backlinks: none + :local: + +----- + Usage ----- diff --git a/docs/source/topics/scheduling.rst b/docs/source/topics/scheduling.rst index 3cb95ec7..c5f410bb 100644 --- a/docs/source/topics/scheduling.rst +++ b/docs/source/topics/scheduling.rst @@ -8,6 +8,12 @@ Since there's no built-in task scheduler in Pyrogram, this page will only show e with the main Python schedule libraries such as ``schedule`` and ``apscheduler``. For more detailed information, you can visit and learn from each library documentation. +.. contents:: Contents + :backlinks: none + :local: + +----- + Using ``schedule`` ------------------ diff --git a/docs/source/topics/serializing.rst b/docs/source/topics/serializing.rst index b4d66f46..8e6f29de 100644 --- a/docs/source/topics/serializing.rst +++ b/docs/source/topics/serializing.rst @@ -5,6 +5,12 @@ Serializing means converting a Pyrogram object, which exists as Python class ins easily shared and stored anywhere. Pyrogram provides two formats for serializing its objects: one good looking for humans and another more compact for machines that is able to recover the original structures. +.. contents:: Contents + :backlinks: none + :local: + +----- + For Humans - str(obj) --------------------- diff --git a/docs/source/topics/session-settings.rst b/docs/source/topics/session-settings.rst index dd777bda..a97dbc06 100644 --- a/docs/source/topics/session-settings.rst +++ b/docs/source/topics/session-settings.rst @@ -20,6 +20,12 @@ That's how a session looks like on the Android app, showing the three main piece - ``device_model``: **CPython 3.7.2** - ``system_version``: **Linux 4.15.0-23-generic** +.. contents:: Contents + :backlinks: none + :local: + +----- + Set Custom Values ----------------- diff --git a/docs/source/topics/smart-plugins.rst b/docs/source/topics/smart-plugins.rst index 7cfed47d..7ffe1cb2 100644 --- a/docs/source/topics/smart-plugins.rst +++ b/docs/source/topics/smart-plugins.rst @@ -9,6 +9,12 @@ different Pyrogram applications with **minimal boilerplate code**. Smart Plugins are completely optional and disabled by default. +.. contents:: Contents + :backlinks: none + :local: + +----- + Introduction ------------ diff --git a/docs/source/topics/storage-engines.rst b/docs/source/topics/storage-engines.rst index 44b4afa6..e7494e2b 100644 --- a/docs/source/topics/storage-engines.rst +++ b/docs/source/topics/storage-engines.rst @@ -5,6 +5,12 @@ Every time you login to Telegram, some personal piece of data are created and he and the server, Telegram). This session data is uniquely bound to your own account, indefinitely (until you logout or decide to manually terminate it) and is used to authorize a client to execute API calls on behalf of your identity. +.. contents:: Contents + :backlinks: none + :local: + +----- + Persisting Sessions ------------------- diff --git a/docs/source/topics/test-servers.rst b/docs/source/topics/test-servers.rst index 2f82f24c..451fc98a 100644 --- a/docs/source/topics/test-servers.rst +++ b/docs/source/topics/test-servers.rst @@ -18,6 +18,12 @@ Telegram's test servers without hassle. All you need to do is start a new sessio Don't worry about your contacts and chats, they will be kept untouched inside the production environment; accounts authorized on test servers reside in a different, parallel instance of a Telegram database. +.. contents:: Contents + :backlinks: none + :local: + +----- + Test Mode in Official Apps -------------------------- diff --git a/docs/source/topics/text-formatting.rst b/docs/source/topics/text-formatting.rst index 0194dc58..f4ac23e1 100644 --- a/docs/source/topics/text-formatting.rst +++ b/docs/source/topics/text-formatting.rst @@ -17,6 +17,12 @@ Pyrogram uses a custom Markdown dialect for text formatting which adds some uniq texts easier in both Markdown and HTML. You can send sophisticated text messages and media captions using a great variety of decorations that can also be nested in order to combine multiple styles together. +.. contents:: Contents + :backlinks: none + :local: + +----- + Basic Styles ------------ diff --git a/docs/source/topics/tgcrypto.rst b/docs/source/topics/tgcrypto.rst index 9dd4c8ac..8feab86a 100644 --- a/docs/source/topics/tgcrypto.rst +++ b/docs/source/topics/tgcrypto.rst @@ -21,10 +21,23 @@ The reason about being an optional package is that TgCrypto requires some extra The errors you receive when trying to install TgCrypto are system dependent, but also descriptive enough to understand what you should do next: -- **Windows**: Install `Visual C++ 2015 Build Tools `_. -- **macOS**: A pop-up will automatically ask you to install the command line developer tools. -- **Linux**: Install a proper C compiler (``gcc``, ``clang``) and the Python header files (``python3-dev``). -- **Termux (Android)**: Install ``clang`` package. +.. tabs:: + + .. tab:: Windows + + Install `Visual C++ 2015 Build Tools `_. + + .. tab:: macOS + + A pop-up will automatically ask you to install the command line developer tools. + + .. tab:: Linux + + Install a proper C compiler (``gcc``, ``clang``) and the Python header files (``python3-dev``). + + .. tab:: Termux + + Install ``clang`` package. .. _TgCrypto: https://github.com/pyrogram/tgcrypto diff --git a/docs/source/topics/use-filters.rst b/docs/source/topics/use-filters.rst index de7a35a8..8806052e 100644 --- a/docs/source/topics/use-filters.rst +++ b/docs/source/topics/use-filters.rst @@ -7,6 +7,12 @@ comes from the server, but there's much more than that to come. Here we'll discuss about :class:`~pyrogram.Filters`. Filters enable a fine-grain control over what kind of updates are allowed or not to be passed in your callback functions, based on their inner details. +.. contents:: Contents + :backlinks: none + :local: + +----- + Single Filters -------------- diff --git a/pyrogram/client/ext/dispatcher.py b/pyrogram/client/ext/dispatcher.py index 88c5b6e0..818bc60c 100644 --- a/pyrogram/client/ext/dispatcher.py +++ b/pyrogram/client/ext/dispatcher.py @@ -26,12 +26,14 @@ from pyrogram.api.types import ( UpdateEditMessage, UpdateEditChannelMessage, UpdateDeleteMessages, UpdateDeleteChannelMessages, UpdateBotCallbackQuery, UpdateInlineBotCallbackQuery, - UpdateUserStatus, UpdateBotInlineQuery, UpdateMessagePoll + UpdateUserStatus, UpdateBotInlineQuery, UpdateMessagePoll, + UpdateBotInlineSend ) from . import utils from ..handlers import ( CallbackQueryHandler, MessageHandler, DeletedMessagesHandler, - UserStatusHandler, RawUpdateHandler, InlineQueryHandler, PollHandler + UserStatusHandler, RawUpdateHandler, InlineQueryHandler, PollHandler, + ChosenInlineResultHandler ) log = logging.getLogger(__name__) @@ -92,13 +94,17 @@ class Dispatcher: async def poll_parser(update, users, chats): return pyrogram.Poll._parse_update(self.client, update), PollHandler + async def chosen_inline_result_parser(update, users, chats): + return pyrogram.ChosenInlineResult._parse(self.client, update, users), ChosenInlineResultHandler + self.update_parsers = { Dispatcher.MESSAGE_UPDATES: message_parser, Dispatcher.DELETE_MESSAGES_UPDATES: deleted_messages_parser, Dispatcher.CALLBACK_QUERY_UPDATES: callback_query_parser, (UpdateUserStatus,): user_status_parser, (UpdateBotInlineQuery,): inline_query_parser, - (UpdateMessagePoll,): poll_parser + (UpdateMessagePoll,): poll_parser, + (UpdateBotInlineSend,): chosen_inline_result_parser } self.update_parsers = {key: value for key_tuple, value in self.update_parsers.items() for key in key_tuple} diff --git a/pyrogram/client/handlers/__init__.py b/pyrogram/client/handlers/__init__.py index 25acbedc..87ef10c5 100644 --- a/pyrogram/client/handlers/__init__.py +++ b/pyrogram/client/handlers/__init__.py @@ -24,8 +24,9 @@ from .message_handler import MessageHandler from .poll_handler import PollHandler from .raw_update_handler import RawUpdateHandler from .user_status_handler import UserStatusHandler +from .chosen_inline_result_handler import ChosenInlineResultHandler __all__ = [ "MessageHandler", "DeletedMessagesHandler", "CallbackQueryHandler", "RawUpdateHandler", "DisconnectHandler", - "UserStatusHandler", "InlineQueryHandler", "PollHandler" + "UserStatusHandler", "InlineQueryHandler", "PollHandler", "ChosenInlineResultHandler" ] diff --git a/pyrogram/client/handlers/chosen_inline_result_handler.py b/pyrogram/client/handlers/chosen_inline_result_handler.py new file mode 100644 index 00000000..f5014ab0 --- /dev/null +++ b/pyrogram/client/handlers/chosen_inline_result_handler.py @@ -0,0 +1,48 @@ +# Pyrogram - Telegram MTProto API Client Library for Python +# Copyright (C) 2017-2020 Dan +# +# This file is part of Pyrogram. +# +# Pyrogram is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Pyrogram is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Pyrogram. If not, see . + +from .handler import Handler + + +class ChosenInlineResultHandler(Handler): + """The ChosenInlineResultHandler handler class. Used to handle chosen inline results coming from inline queries. + It is intended to be used with :meth:`~Client.add_handler` + + For a nicer way to register this handler, have a look at the + :meth:`~Client.on_chosen_inline_query` decorator. + + Parameters: + callback (``callable``): + Pass a function that will be called when a new chosen inline result arrives. + It takes *(client, chosen_inline_result)* as positional arguments (look at the section below for a + detailed description). + + filters (:obj:`Filters`): + Pass one or more filters to allow only a subset of chosen inline results to be passed + in your callback function. + + Other parameters: + client (:obj:`Client`): + The Client itself, useful when you want to call other API methods inside the message handler. + + chosen_inline_result (:obj:`ChosenInlineResult`): + The received chosen inline result. + """ + + def __init__(self, callback: callable, filters=None): + super().__init__(callback, filters) diff --git a/pyrogram/client/methods/decorators/__init__.py b/pyrogram/client/methods/decorators/__init__.py index 2c0a749a..5a60ff9b 100644 --- a/pyrogram/client/methods/decorators/__init__.py +++ b/pyrogram/client/methods/decorators/__init__.py @@ -24,6 +24,7 @@ from .on_message import OnMessage from .on_poll import OnPoll from .on_raw_update import OnRawUpdate from .on_user_status import OnUserStatus +from .on_chosen_inline_result import OnChosenInlineResult class Decorators( @@ -34,6 +35,7 @@ class Decorators( OnDisconnect, OnUserStatus, OnInlineQuery, - OnPoll + OnPoll, + OnChosenInlineResult ): pass diff --git a/pyrogram/client/methods/decorators/on_chosen_inline_result.py b/pyrogram/client/methods/decorators/on_chosen_inline_result.py new file mode 100644 index 00000000..40446eb2 --- /dev/null +++ b/pyrogram/client/methods/decorators/on_chosen_inline_result.py @@ -0,0 +1,56 @@ +# Pyrogram - Telegram MTProto API Client Library for Python +# Copyright (C) 2017-2020 Dan +# +# This file is part of Pyrogram. +# +# Pyrogram is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Pyrogram is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Pyrogram. If not, see . + +from typing import Callable + +import pyrogram +from pyrogram.client.filters.filter import Filter +from ...ext import BaseClient + + +class OnChosenInlineResult(BaseClient): + def on_chosen_inline_result( + self=None, + filters=None, + group: int = 0 + ) -> callable: + """Decorator for handling chosen inline results. + + This does the same thing as :meth:`~pyrogram.Client.add_handler` using the :obj:`~pyrogram.ChosenInlineResult`. + + Parameters: + filters (:obj:`~pyrogram.Filters`, *optional*): + Pass one or more filters to allow only a subset of chosen inline results to be passed + in your function. + + group (``int``, *optional*): + The group identifier, defaults to 0. + """ + + def decorator(func: Callable) -> Callable: + if isinstance(self, pyrogram.Client): + self.add_handler(pyrogram.ChosenInlineResultHandler(func, filters), group) + elif isinstance(self, Filter) or self is None: + func.handler = ( + pyrogram.ChosenInlineResultHandler(func, self), + group if filters is None else filters + ) + + return func + + return decorator diff --git a/pyrogram/client/methods/messages/send_cached_media.py b/pyrogram/client/methods/messages/send_cached_media.py index 9cc02928..79425726 100644 --- a/pyrogram/client/methods/messages/send_cached_media.py +++ b/pyrogram/client/methods/messages/send_cached_media.py @@ -61,7 +61,7 @@ class SendCachedMedia(BaseClient): A valid file reference obtained by a recently fetched media message. To be used in combination with a file id in case a file reference is needed. - caption (``bool``, *optional*): + caption (``str``, *optional*): Media caption, 0-1024 characters. parse_mode (``str``, *optional*): diff --git a/pyrogram/client/types/inline_mode/__init__.py b/pyrogram/client/types/inline_mode/__init__.py index 68da92d7..4980377d 100644 --- a/pyrogram/client/types/inline_mode/__init__.py +++ b/pyrogram/client/types/inline_mode/__init__.py @@ -21,8 +21,9 @@ from .inline_query_result import InlineQueryResult from .inline_query_result_animation import InlineQueryResultAnimation from .inline_query_result_article import InlineQueryResultArticle from .inline_query_result_photo import InlineQueryResultPhoto +from .chosen_inline_result import ChosenInlineResult __all__ = [ "InlineQuery", "InlineQueryResult", "InlineQueryResultArticle", "InlineQueryResultPhoto", - "InlineQueryResultAnimation" + "InlineQueryResultAnimation", "ChosenInlineResult" ] diff --git a/pyrogram/client/types/inline_mode/chosen_inline_result.py b/pyrogram/client/types/inline_mode/chosen_inline_result.py new file mode 100644 index 00000000..cdc5afc9 --- /dev/null +++ b/pyrogram/client/types/inline_mode/chosen_inline_result.py @@ -0,0 +1,117 @@ +# Pyrogram - Telegram MTProto API Client Library for Python +# Copyright (C) 2017-2020 Dan +# +# This file is part of Pyrogram. +# +# Pyrogram is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Pyrogram is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Pyrogram. If not, see . +# +# This file is part of Pyrogram. +# +# Pyrogram is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Pyrogram is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Pyrogram. If not, see . + +from base64 import b64encode +from struct import pack +from typing import Union + +import pyrogram +from pyrogram.api import types +from pyrogram.client.types.object import Object +from pyrogram.client.types.update import Update +from pyrogram.client.types.user_and_chats import User +from pyrogram.client.types.messages_and_media import Location +from pyrogram.client.ext import utils + + +class ChosenInlineResult(Object, Update): + """A :doc:`result ` of an inline query chosen by the user and sent to their chat partner. + + Parameters: + result_id (``str``): + The unique identifier for the result that was chosen. + + from_user (:obj:`User`): + The user that chose the result. + + query (``str``): + The query that was used to obtain the result. + + location (:obj:`Location`, *optional*): + Sender location, only for bots that require user location. + + inline_message_id (``str``, *optional*): + Identifier of the sent inline message. + Available only if there is an :doc:`inline keyboard ` attached to the message. + Will be also received in :doc:`callback queries ` and can be used to edit the message. + + .. note:: + + It is necessary to enable inline feedback via `@Botfather `_ in order to receive these + objects in updates. + """ + + def __init__( + self, + *, + client: "pyrogram.BaseClient" = None, + result_id: str, + from_user: User, + query: str, + location: "pyrogram.Location" = None, + inline_message_id: str = None, + ): + super().__init__(client) + + self.result_id = result_id + self.from_user = from_user + self.query = query + self.location = location + self.inline_message_id = inline_message_id + + @staticmethod + def _parse(client, chosen_inline_result: types.UpdateBotInlineSend, users) -> "ChosenInlineResult": + inline_message_id = None + + if isinstance(chosen_inline_result.msg_id, types.InputBotInlineMessageID): + inline_message_id = b64encode( + pack( + " "Photo": + photo = media_photo.photo + if isinstance(photo, types.Photo): big = photo.sizes[-1] @@ -91,6 +98,7 @@ class Photo(Object): file_ref=encode_file_ref(photo.file_reference), width=big.w, height=big.h, + ttl_seconds=media_photo.ttl_seconds, file_size=big.size, date=photo.date, thumbs=Thumbnail._parse(client, photo),