mirror of
https://github.com/pyrogram/pyrogram
synced 2025-08-30 22:05:28 +00:00
Merge develop -> asyncio
This commit is contained in:
@@ -53,10 +53,10 @@ def get_docstring_arg_type(t: str, is_list: bool = False, is_pyrogram_type: bool
|
|||||||
return "``{}``".format(t.lower())
|
return "``{}``".format(t.lower())
|
||||||
elif t == "true":
|
elif t == "true":
|
||||||
return "``bool``"
|
return "``bool``"
|
||||||
elif t == "Object" or t == "X":
|
elif t == "TLObject" or t == "X":
|
||||||
return "Any object from :obj:`pyrogram.api.types`"
|
return "Any object from :obj:`~pyrogram.api.types`"
|
||||||
elif t == "!X":
|
elif t == "!X":
|
||||||
return "Any method from :obj:`pyrogram.api.functions`"
|
return "Any method from :obj:`~pyrogram.api.functions`"
|
||||||
elif t.startswith("Vector"):
|
elif t.startswith("Vector"):
|
||||||
return "List of " + get_docstring_arg_type(t.split("<", 1)[1][:-1], True, is_pyrogram_type)
|
return "List of " + get_docstring_arg_type(t.split("<", 1)[1][:-1], True, is_pyrogram_type)
|
||||||
else:
|
else:
|
||||||
@@ -394,7 +394,7 @@ def start():
|
|||||||
)
|
)
|
||||||
|
|
||||||
read_types += "\n "
|
read_types += "\n "
|
||||||
read_types += "{} = Object.read(b{}) if flags & (1 << {}) else []\n ".format(
|
read_types += "{} = TLObject.read(b{}) if flags & (1 << {}) else []\n ".format(
|
||||||
arg_name, ", {}".format(sub_type.title()) if sub_type in core_types else "", index
|
arg_name, ", {}".format(sub_type.title()) if sub_type in core_types else "", index
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
@@ -403,7 +403,7 @@ def start():
|
|||||||
write_types += "b.write(self.{}.write())\n ".format(arg_name)
|
write_types += "b.write(self.{}.write())\n ".format(arg_name)
|
||||||
|
|
||||||
read_types += "\n "
|
read_types += "\n "
|
||||||
read_types += "{} = Object.read(b) if flags & (1 << {}) else None\n ".format(
|
read_types += "{} = TLObject.read(b) if flags & (1 << {}) else None\n ".format(
|
||||||
arg_name, index
|
arg_name, index
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
@@ -422,7 +422,7 @@ def start():
|
|||||||
)
|
)
|
||||||
|
|
||||||
read_types += "\n "
|
read_types += "\n "
|
||||||
read_types += "{} = Object.read(b{})\n ".format(
|
read_types += "{} = TLObject.read(b{})\n ".format(
|
||||||
arg_name, ", {}".format(sub_type.title()) if sub_type in core_types else ""
|
arg_name, ", {}".format(sub_type.title()) if sub_type in core_types else ""
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
@@ -430,7 +430,7 @@ def start():
|
|||||||
write_types += "b.write(self.{}.write())\n ".format(arg_name)
|
write_types += "b.write(self.{}.write())\n ".format(arg_name)
|
||||||
|
|
||||||
read_types += "\n "
|
read_types += "\n "
|
||||||
read_types += "{} = Object.read(b)\n ".format(arg_name)
|
read_types += "{} = TLObject.read(b)\n ".format(arg_name)
|
||||||
|
|
||||||
if c.docs:
|
if c.docs:
|
||||||
description = c.docs.split("|")[0].split("§")[1]
|
description = c.docs.split("|")[0].split("§")[1]
|
||||||
|
@@ -1356,4 +1356,7 @@ langpack.getLanguage#6a596502 lang_pack:string lang_code:string = LangPackLangua
|
|||||||
folders.editPeerFolders#6847d0ab folder_peers:Vector<InputFolderPeer> = Updates;
|
folders.editPeerFolders#6847d0ab folder_peers:Vector<InputFolderPeer> = Updates;
|
||||||
folders.deleteFolder#1c295881 folder_id:int = Updates;
|
folders.deleteFolder#1c295881 folder_id:int = Updates;
|
||||||
|
|
||||||
// LAYER 100
|
// LAYER 100
|
||||||
|
|
||||||
|
// Ports
|
||||||
|
channels.exportInvite#c7560885 channel:InputChannel = ExportedChatInvite;
|
@@ -5,7 +5,7 @@ from io import BytesIO
|
|||||||
from pyrogram.api.core import *
|
from pyrogram.api.core import *
|
||||||
|
|
||||||
|
|
||||||
class {class_name}(Object):
|
class {class_name}(TLObject):
|
||||||
"""{docstring_args}
|
"""{docstring_args}
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
80
docs/releases.py
Normal file
80
docs/releases.py
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
# Pyrogram - Telegram MTProto API Client Library for Python
|
||||||
|
# Copyright (C) 2017-2019 Dan Tès <https://github.com/delivrance>
|
||||||
|
#
|
||||||
|
# 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 <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
import shutil
|
||||||
|
from datetime import datetime
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
import pypandoc
|
||||||
|
import requests
|
||||||
|
|
||||||
|
URL = "https://api.github.com/repos/pyrogram/pyrogram/releases"
|
||||||
|
DEST = Path("source/releases")
|
||||||
|
INTRO = """
|
||||||
|
Release Notes
|
||||||
|
=============
|
||||||
|
|
||||||
|
Release notes for Pyrogram releases will describe what's new in each version, and will also make you aware of any
|
||||||
|
backwards-incompatible changes made in that version.
|
||||||
|
|
||||||
|
When upgrading to a new version of Pyrogram, you will need to check all the breaking changes in order to find
|
||||||
|
incompatible code in your application, but also to take advantage of new features and improvements.
|
||||||
|
|
||||||
|
Releases
|
||||||
|
--------
|
||||||
|
|
||||||
|
""".lstrip("\n")
|
||||||
|
|
||||||
|
shutil.rmtree(DEST, ignore_errors=True)
|
||||||
|
DEST.mkdir(parents=True)
|
||||||
|
|
||||||
|
releases = requests.get(URL).json()
|
||||||
|
|
||||||
|
with open(DEST / "index.rst", "w") as index:
|
||||||
|
index.write(INTRO)
|
||||||
|
|
||||||
|
tags = []
|
||||||
|
|
||||||
|
for release in releases:
|
||||||
|
tag = release["tag_name"]
|
||||||
|
title = release["name"]
|
||||||
|
name = title.split(" - ")[1]
|
||||||
|
|
||||||
|
date = datetime.strptime(
|
||||||
|
release["published_at"],
|
||||||
|
"%Y-%m-%dT%H:%M:%SZ"
|
||||||
|
).strftime("%b %d, %Y - %H:%M:%S (UTC)")
|
||||||
|
|
||||||
|
body = pypandoc.convert_text(
|
||||||
|
release["body"].replace(r"\r\n", "\n"),
|
||||||
|
"rst",
|
||||||
|
format="markdown_github",
|
||||||
|
extra_args=["--wrap=none"]
|
||||||
|
)
|
||||||
|
|
||||||
|
index.write("- :doc:`{} <{}>`\n".format(title, tag))
|
||||||
|
tags.append(tag)
|
||||||
|
|
||||||
|
with open(DEST / "{}.rst".format(tag), "w") as page:
|
||||||
|
page.write("Pyrogram " + tag + "\n" + "=" * (len(tag) + 9) + "\n\n")
|
||||||
|
page.write("--- *Released on " + str(date) + "*\n\n")
|
||||||
|
page.write(name + "\n" + "-" * len(name) + "\n\n")
|
||||||
|
page.write(body + "\n\n")
|
||||||
|
|
||||||
|
index.write("\n.. toctree::\n :hidden:\n\n")
|
||||||
|
index.write("\n".join(" {}".format(tag) for tag in tags))
|
@@ -67,6 +67,7 @@ Messages
|
|||||||
- :meth:`~Client.get_messages`
|
- :meth:`~Client.get_messages`
|
||||||
- :meth:`~Client.get_history`
|
- :meth:`~Client.get_history`
|
||||||
- :meth:`~Client.get_history_count`
|
- :meth:`~Client.get_history_count`
|
||||||
|
- :meth:`~Client.read_history`
|
||||||
- :meth:`~Client.iter_history`
|
- :meth:`~Client.iter_history`
|
||||||
- :meth:`~Client.send_poll`
|
- :meth:`~Client.send_poll`
|
||||||
- :meth:`~Client.vote_poll`
|
- :meth:`~Client.vote_poll`
|
||||||
@@ -200,6 +201,7 @@ Details
|
|||||||
.. automethod:: Client.get_messages()
|
.. automethod:: Client.get_messages()
|
||||||
.. automethod:: Client.get_history()
|
.. automethod:: Client.get_history()
|
||||||
.. automethod:: Client.get_history_count()
|
.. automethod:: Client.get_history_count()
|
||||||
|
.. automethod:: Client.read_history()
|
||||||
.. automethod:: Client.iter_history()
|
.. automethod:: Client.iter_history()
|
||||||
.. automethod:: Client.send_poll()
|
.. automethod:: Client.send_poll()
|
||||||
.. automethod:: Client.vote_poll()
|
.. automethod:: Client.vote_poll()
|
||||||
|
@@ -58,7 +58,7 @@ html_show_copyright = False
|
|||||||
html_theme_options = {
|
html_theme_options = {
|
||||||
"canonical_url": "https://docs.pyrogram.org/",
|
"canonical_url": "https://docs.pyrogram.org/",
|
||||||
"collapse_navigation": True,
|
"collapse_navigation": True,
|
||||||
"sticky_navigation": False,
|
"sticky_navigation": True,
|
||||||
"logo_only": True,
|
"logo_only": True,
|
||||||
"display_version": True,
|
"display_version": True,
|
||||||
"style_external_links": True
|
"style_external_links": True
|
||||||
|
@@ -155,6 +155,14 @@ things:
|
|||||||
chats).
|
chats).
|
||||||
- The chat id argument you passed is in form of a string; you have to convert it into an integer with ``int(chat_id)``.
|
- The chat id argument you passed is in form of a string; you have to convert it into an integer with ``int(chat_id)``.
|
||||||
|
|
||||||
|
UnicodeEncodeError: '<encoding>' codec can't encode …
|
||||||
|
-----------------------------------------------------
|
||||||
|
|
||||||
|
Where ``<encoding>`` might be *ascii*, *cp932*, *charmap* or anything else other than **utf-8**. This error usually
|
||||||
|
shows up when you try to print something and has very little to do with Pyrogram itself as it is strictly related to
|
||||||
|
your own terminal. To fix it, either find a way to change the encoding settings of your terminal to UTF-8 or switch to a
|
||||||
|
better one.
|
||||||
|
|
||||||
My verification code expires immediately!
|
My verification code expires immediately!
|
||||||
-----------------------------------------
|
-----------------------------------------
|
||||||
|
|
||||||
@@ -179,8 +187,20 @@ Having said that, here's a list of what Telegram definitely doesn't like:
|
|||||||
- Spam, sending unsolicited messages or adding people to unwanted groups and channels.
|
- Spam, sending unsolicited messages or adding people to unwanted groups and channels.
|
||||||
- Virtual/VoIP and cheap real numbers, because they are relatively easy to get and likely used for spam/flood.
|
- Virtual/VoIP and cheap real numbers, because they are relatively easy to get and likely used for spam/flood.
|
||||||
|
|
||||||
However, you might be right, and your account was deactivated/limited without any reason. This could happen because of
|
And here's a good explanation of how, probably, the system works:
|
||||||
mistakes by either the automatic systems or a moderator. In such cases you can kindly email Telegram at
|
|
||||||
|
.. raw:: html
|
||||||
|
|
||||||
|
<script
|
||||||
|
async src="https://telegram.org/js/telegram-widget.js?5"
|
||||||
|
data-telegram-post="PyrogramChat/69424"
|
||||||
|
data-width="100%">
|
||||||
|
</script>
|
||||||
|
|
||||||
|
.. centered:: Join the discussion at `@PyrogramChat <https://t.me/pyrogramchat>`_
|
||||||
|
|
||||||
|
However, you might be right, and your account was deactivated/limited without any good reason. This could happen because
|
||||||
|
of mistakes by either the automatic systems or a moderator. In such cases you can kindly email Telegram at
|
||||||
recover@telegram.org, contact `@smstelegram`_ on Twitter or use `this form`_.
|
recover@telegram.org, contact `@smstelegram`_ on Twitter or use `this form`_.
|
||||||
|
|
||||||
Are there any secret easter eggs?
|
Are there any secret easter eggs?
|
||||||
|
@@ -9,7 +9,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`_.
|
If you think something interesting could be added here, feel free to propose it by opening a `Feature Request`_.
|
||||||
|
|
||||||
|
|
||||||
|
Terms
|
||||||
|
-----
|
||||||
|
|
||||||
.. glossary::
|
.. glossary::
|
||||||
|
:sorted:
|
||||||
|
|
||||||
API
|
API
|
||||||
Application Programming Interface: a set of methods, protocols and tools that make it easier to develop programs
|
Application Programming Interface: a set of methods, protocols and tools that make it easier to develop programs
|
||||||
|
@@ -83,10 +83,10 @@ Meta
|
|||||||
|
|
||||||
- :doc:`Pyrogram FAQ <faq>`: Answers to common Pyrogram questions.
|
- :doc:`Pyrogram FAQ <faq>`: Answers to common Pyrogram questions.
|
||||||
- :doc:`Pyrogram Glossary <glossary>`: List of words with brief explanations.
|
- :doc:`Pyrogram Glossary <glossary>`: List of words with brief explanations.
|
||||||
- :doc:`Release Notes <releases>`: Release notes for Pyrogram releases.
|
|
||||||
- :doc:`Powered by Pyrogram <powered-by>`: Collection of Pyrogram Projects.
|
- :doc:`Powered by Pyrogram <powered-by>`: Collection of Pyrogram Projects.
|
||||||
- :doc:`Support Pyrogram <support-pyrogram>`: Ways to show your appreciation.
|
- :doc:`Support Pyrogram <support-pyrogram>`: Ways to show your appreciation.
|
||||||
- :doc:`About the License <license>`: Information about the Project license.
|
- :doc:`About the License <license>`: Information about the Project license.
|
||||||
|
- :doc:`Release Notes <releases/index>`: Release notes for Pyrogram releases.
|
||||||
|
|
||||||
.. toctree::
|
.. toctree::
|
||||||
:hidden:
|
:hidden:
|
||||||
@@ -122,7 +122,8 @@ Meta
|
|||||||
:hidden:
|
:hidden:
|
||||||
:caption: Topic Guides
|
:caption: Topic Guides
|
||||||
|
|
||||||
topics/filters
|
topics/use-filters
|
||||||
|
topics/create-filters
|
||||||
topics/more-on-updates
|
topics/more-on-updates
|
||||||
topics/config-file
|
topics/config-file
|
||||||
topics/smart-plugins
|
topics/smart-plugins
|
||||||
@@ -134,6 +135,7 @@ Meta
|
|||||||
topics/proxy
|
topics/proxy
|
||||||
topics/bots-interaction
|
topics/bots-interaction
|
||||||
topics/mtproto-vs-botapi
|
topics/mtproto-vs-botapi
|
||||||
|
topics/debugging
|
||||||
topics/test-servers
|
topics/test-servers
|
||||||
topics/advanced-usage
|
topics/advanced-usage
|
||||||
topics/voice-calls
|
topics/voice-calls
|
||||||
@@ -144,10 +146,10 @@ Meta
|
|||||||
|
|
||||||
faq
|
faq
|
||||||
glossary
|
glossary
|
||||||
releases
|
|
||||||
powered-by
|
powered-by
|
||||||
support-pyrogram
|
support-pyrogram
|
||||||
license
|
license
|
||||||
|
releases/index
|
||||||
|
|
||||||
.. toctree::
|
.. toctree::
|
||||||
:hidden:
|
:hidden:
|
||||||
|
@@ -1,13 +0,0 @@
|
|||||||
Release Notes
|
|
||||||
=============
|
|
||||||
|
|
||||||
Release notes for Pyrogram releases will describe what's new in each version, and will also make you aware of any
|
|
||||||
backwards-incompatible changes made in that version.
|
|
||||||
|
|
||||||
When upgrading to a new version of Pyrogram, you will need to check all the breaking changes in order to find
|
|
||||||
incompatible code in your application, but also to take advantage of new features and improvements.
|
|
||||||
|
|
||||||
.. note::
|
|
||||||
|
|
||||||
Currently, all Pyrogram release notes live inside the GitHub repository web page:
|
|
||||||
https://github.com/pyrogram/pyrogram/releases.
|
|
@@ -24,40 +24,40 @@ Making API method calls with Pyrogram is very simple. Here's an example we are g
|
|||||||
|
|
||||||
app.stop()
|
app.stop()
|
||||||
|
|
||||||
Let's begin by importing the Client class from the Pyrogram package:
|
#. Let's begin by importing the Client class from the Pyrogram package:
|
||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
from pyrogram import Client
|
from pyrogram import Client
|
||||||
|
|
||||||
Now instantiate a new Client object, "my_account" is a session name of your choice:
|
#. Now instantiate a new Client object, "my_account" is a session name of your choice:
|
||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
app = Client("my_account")
|
app = Client("my_account")
|
||||||
|
|
||||||
To actually make use of any method, the client has to be started first:
|
#. To actually make use of any method, the client has to be started first:
|
||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
app.start()
|
app.start()
|
||||||
|
|
||||||
Now, you can call any method you like:
|
#. Now, you can call any method you like:
|
||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
print(app.get_me()) # Print information about yourself
|
print(app.get_me()) # Print information about yourself
|
||||||
|
|
||||||
# Send messages to yourself:
|
# Send messages to yourself:
|
||||||
app.send_message("me", "Hi!") # Text message
|
app.send_message("me", "Hi!") # Text message
|
||||||
app.send_location("me", 51.500729, -0.124583) # Location
|
app.send_location("me", 51.500729, -0.124583) # Location
|
||||||
app.send_sticker("me", "CAADBAADyg4AAvLQYAEYD4F7vcZ43AI") # Sticker
|
app.send_sticker("me", "CAADBAADyg4AAvLQYAEYD4F7vcZ43AI") # Sticker
|
||||||
|
|
||||||
Finally, when done, simply stop the client:
|
#. Finally, when done, simply stop the client:
|
||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
app.stop()
|
app.stop()
|
||||||
|
|
||||||
Context Manager
|
Context Manager
|
||||||
---------------
|
---------------
|
||||||
|
@@ -45,36 +45,37 @@ arrives:
|
|||||||
|
|
||||||
app.run()
|
app.run()
|
||||||
|
|
||||||
Let's examine these four new pieces. First one: a callback function we defined which accepts two arguments -
|
#. Let's examine these four new pieces. First one: a callback function we defined which accepts two arguments -
|
||||||
*(client, message)*. This will be the function that gets executed every time a new message arrives and Pyrogram will
|
*(client, message)*. This will be the function that gets executed every time a new message arrives and Pyrogram will
|
||||||
call that function by passing the client instance and the new message instance as argument.
|
call that function by passing the client instance and the new message instance as argument.
|
||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
def my_function(client, message):
|
def my_function(client, message):
|
||||||
print(message)
|
print(message)
|
||||||
|
|
||||||
Second one: the :class:`~pyrogram.MessageHandler`. This object tells Pyrogram the function we defined above must only
|
#. Second one: the :class:`~pyrogram.MessageHandler`. This object tells Pyrogram the function we defined above must
|
||||||
handle updates that are in form of a :class:`~pyrogram.Message`:
|
only handle updates that are in form of a :class:`~pyrogram.Message`:
|
||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
my_handler = MessageHandler(my_function)
|
my_handler = MessageHandler(my_function)
|
||||||
|
|
||||||
Third: the method :meth:`~pyrogram.Client.add_handler`. This method is used to actually register the handler and let
|
#. Third: the method :meth:`~pyrogram.Client.add_handler`. This method is used to actually register the handler and let
|
||||||
Pyrogram know it needs to be taken into consideration when new updates arrive and the internal dispatching phase begins.
|
Pyrogram know it needs to be taken into consideration when new updates arrive and the internal dispatching phase
|
||||||
|
begins.
|
||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
app.add_handler(my_handler)
|
app.add_handler(my_handler)
|
||||||
|
|
||||||
Last one, the :meth:`~pyrogram.Client.run` method. What this does is simply call :meth:`~pyrogram.Client.start` and a
|
#. Last one, the :meth:`~pyrogram.Client.run` method. What this does is simply call :meth:`~pyrogram.Client.start` and
|
||||||
special method :meth:`~pyrogram.Client.idle` that keeps your main scripts alive until you press ``CTRL+C``; the client
|
a special method :meth:`~pyrogram.Client.idle` that keeps your main scripts alive until you press ``CTRL+C``; the
|
||||||
will be automatically stopped after that.
|
client will be automatically stopped after that.
|
||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
app.run()
|
app.run()
|
||||||
|
|
||||||
Using Decorators
|
Using Decorators
|
||||||
----------------
|
----------------
|
||||||
|
@@ -122,7 +122,7 @@ For example, given the ID *123456789*, here's how Pyrogram can tell entities apa
|
|||||||
|
|
||||||
- ``+ID`` User: *123456789*
|
- ``+ID`` User: *123456789*
|
||||||
- ``-ID`` Chat: *-123456789*
|
- ``-ID`` Chat: *-123456789*
|
||||||
- ``-100ID`` Channel (and Supergroup): *-100123456789*
|
- ``-100ID`` Channel or Supergroup: *-100123456789*
|
||||||
|
|
||||||
So, every time you take a raw ID, make sure to translate it into the correct ID when you want to use it with an
|
So, every time you take a raw ID, make sure to translate it into the correct ID when you want to use it with an
|
||||||
high-level method.
|
high-level method.
|
||||||
|
92
docs/source/topics/create-filters.rst
Normal file
92
docs/source/topics/create-filters.rst
Normal file
@@ -0,0 +1,92 @@
|
|||||||
|
Creating Filters
|
||||||
|
================
|
||||||
|
|
||||||
|
Pyrogram already provides lots of built-in :class:`~pyrogram.Filters` to work with, but in case you can't find
|
||||||
|
a specific one for your needs or want to build a custom filter by yourself (to be used in a different kind of handler,
|
||||||
|
for example) you can use :meth:`~pyrogram.Filters.create`.
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
At the moment, the built-in filters are intended to be used with the :class:`~pyrogram.MessageHandler` only.
|
||||||
|
|
||||||
|
Custom Filters
|
||||||
|
--------------
|
||||||
|
|
||||||
|
An example to demonstrate how custom filters work is to show how to create and use one for the
|
||||||
|
:class:`~pyrogram.CallbackQueryHandler`. Note that callback queries updates are only received by bots; create and
|
||||||
|
:doc:`authorize your bot <../start/auth>`, then send a message with an inline keyboard to yourself. This allows you to
|
||||||
|
test your filter by pressing the inline button:
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
from pyrogram import InlineKeyboardMarkup, InlineKeyboardButton
|
||||||
|
|
||||||
|
app.send_message(
|
||||||
|
"username", # Change this to your username or id
|
||||||
|
"Pyrogram's custom filter test",
|
||||||
|
reply_markup=InlineKeyboardMarkup(
|
||||||
|
[[InlineKeyboardButton("Press me", b"pyrogram")]]
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
Basic Filters
|
||||||
|
-------------
|
||||||
|
|
||||||
|
For this basic filter we will be using only the first two parameters of :meth:`~pyrogram.Filters.create`.
|
||||||
|
|
||||||
|
The code below creates a simple filter for hardcoded, static callback data. This filter will only allow callback queries
|
||||||
|
containing "Pyrogram" as data, that is, the function *func* you pass returns True in case the callback query data
|
||||||
|
equals to ``b"Pyrogram"``.
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
static_data = Filters.create(
|
||||||
|
name="StaticdData",
|
||||||
|
func=lambda flt, callback_query: callback_query.data == b"Pyrogram"
|
||||||
|
)
|
||||||
|
|
||||||
|
The ``lambda`` operator in python is used to create small anonymous functions and is perfect for this example, the same
|
||||||
|
could be achieved with a normal function, but we don't really need it as it makes sense only inside the filter's scope:
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
def func(flt, callback_query):
|
||||||
|
return callback_query.data == b"Pyrogram"
|
||||||
|
|
||||||
|
static_data = Filters.create(
|
||||||
|
name="StaticData",
|
||||||
|
func=func
|
||||||
|
)
|
||||||
|
|
||||||
|
The filter usage remains the same:
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
@app.on_callback_query(static_data)
|
||||||
|
def pyrogram_data(client, callback_query):
|
||||||
|
client.answer_callback_query(callback_query.id, "it works!")
|
||||||
|
|
||||||
|
Filters with Arguments
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
A much cooler filter would be one that accepts "Pyrogram" or any other data as argument at usage time.
|
||||||
|
A dynamic filter like this will make use of the third parameter of :meth:`~pyrogram.Filters.create`.
|
||||||
|
|
||||||
|
This is how a dynamic custom filter looks like:
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
def dynamic_data(data):
|
||||||
|
return Filters.create(
|
||||||
|
name="DynamicData",
|
||||||
|
func=lambda flt, callback_query: flt.data == callback_query.data,
|
||||||
|
data=data # "data" kwarg is accessed with "filter.data"
|
||||||
|
)
|
||||||
|
|
||||||
|
And its usage:
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
@app.on_callback_query(dynamic_data(b"Pyrogram"))
|
||||||
|
def pyrogram_data(client, callback_query):
|
||||||
|
client.answer_callback_query(callback_query.id, "it works!")
|
135
docs/source/topics/debugging.rst
Normal file
135
docs/source/topics/debugging.rst
Normal file
@@ -0,0 +1,135 @@
|
|||||||
|
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.
|
||||||
|
|
||||||
|
Caveman Debugging
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
*The most effective debugging tool is still careful thought, coupled with judiciously placed print statements.*
|
||||||
|
|
||||||
|
-- Brian Kernighan, "Unix for Beginners" (1979)
|
||||||
|
|
||||||
|
Adding ``print()`` statements in crucial parts of your code is by far the most ancient, yet efficient technique for
|
||||||
|
debugging programs, especially considering the concurrent nature of the framework itself. Pyrogram goodness in this
|
||||||
|
respect comes with the fact that any object can be nicely printed just by calling ``print(obj)``, thus giving to you
|
||||||
|
an insight of all its inner details.
|
||||||
|
|
||||||
|
Consider the following code:
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
dan = app.get_users("haskell")
|
||||||
|
print(dan) # User
|
||||||
|
|
||||||
|
This will show a JSON representation of the object returned by :meth:`~pyrogram.Client.get_users`, which is a
|
||||||
|
:class:`~pyrogram.User` instance, in this case. The output on your terminal will be something similar to this:
|
||||||
|
|
||||||
|
.. code-block:: json
|
||||||
|
|
||||||
|
{
|
||||||
|
"_": "pyrogram.User",
|
||||||
|
"id": 23122162,
|
||||||
|
"is_self": false,
|
||||||
|
"is_contact": false,
|
||||||
|
"is_mutual_contact": false,
|
||||||
|
"is_deleted": false,
|
||||||
|
"is_bot": false,
|
||||||
|
"is_verified": false,
|
||||||
|
"is_restricted": false,
|
||||||
|
"is_support": false,
|
||||||
|
"is_scam": false,
|
||||||
|
"first_name": "Dan",
|
||||||
|
"status": {
|
||||||
|
"_": "pyrogram.UserStatus",
|
||||||
|
"user_id": 23122162,
|
||||||
|
"recently": true
|
||||||
|
},
|
||||||
|
"username": "haskell",
|
||||||
|
"language_code": "en",
|
||||||
|
"photo": {
|
||||||
|
"_": "pyrogram.ChatPhoto",
|
||||||
|
"small_file_id": "AQADBAAD8tBgAQAEJjCxGgAEo5IBAAIC",
|
||||||
|
"big_file_id": "AQADBAAD8tBgAQAEJjCxGgAEpZIBAAEBAg"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
As you've probably guessed already, Pyrogram objects can be nested. That's how compound data are built, and nesting
|
||||||
|
keeps going until we are left with base data types only, such as ``str``, ``int``, ``bool``, etc.
|
||||||
|
|
||||||
|
Accessing Attributes
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
Even though you see a JSON output, it doesn't mean we are dealing with dictionaries; in fact, all Pyrogram types are
|
||||||
|
full-fledged Python objects and the correct way to access any attribute of them is by using the dot notation ``.``:
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
dan_photo = dan.photo
|
||||||
|
print(dan_photo) # ChatPhoto
|
||||||
|
|
||||||
|
.. code-block:: json
|
||||||
|
|
||||||
|
{
|
||||||
|
"_": "pyrogram.ChatPhoto",
|
||||||
|
"small_file_id": "AQADBAAD8tBgAQAEJjCxGgAEo5IBAAIC",
|
||||||
|
"big_file_id": "AQADBAAD8tBgAQAEJjCxGgAEpZIBAAEBAg"
|
||||||
|
}
|
||||||
|
|
||||||
|
However, the bracket notation ``[]`` is also supported, but its usage is discouraged:
|
||||||
|
|
||||||
|
.. warning::
|
||||||
|
|
||||||
|
Bracket notation in Python is not commonly used for getting/setting object attributes. While it works for Pyrogram
|
||||||
|
objects, it might not work for anything else and you should not rely on this.
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
dan_photo_big = dan["photo"]["big_file_id"]
|
||||||
|
print(dan_photo_big) # str
|
||||||
|
|
||||||
|
.. code-block:: text
|
||||||
|
|
||||||
|
AQADBAAD8tBgAQAEJjCxGgAEpZIBAAEBAg
|
||||||
|
|
||||||
|
Checking an Object's Type
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
Another thing worth talking about is how to tell and check for an object's type.
|
||||||
|
|
||||||
|
As you noticed already, when printing an object you'll see the special attribute ``"_"``. This is just a visual thing
|
||||||
|
useful to show humans the object type, but doesn't really exist anywhere; any attempt in accessing it will lead to an
|
||||||
|
error. The correct way to get the object type is by using the built-in function ``type()``:
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
dan_status = dan.status
|
||||||
|
print(type(dan_status))
|
||||||
|
|
||||||
|
.. code-block:: text
|
||||||
|
|
||||||
|
<class 'pyrogram.UserStatus'>
|
||||||
|
|
||||||
|
And to check if an object is an instance of a given class, you use the built-in function ``isinstance()``:
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
:name: this-py
|
||||||
|
|
||||||
|
from pyrogram import UserStatus
|
||||||
|
|
||||||
|
dan_status = dan.status
|
||||||
|
print(isinstance(dan_status, UserStatus))
|
||||||
|
|
||||||
|
.. code-block:: text
|
||||||
|
|
||||||
|
True
|
||||||
|
|
||||||
|
.. raw:: html
|
||||||
|
|
||||||
|
<script>
|
||||||
|
var e = document.querySelector("blockquote p.attribution");
|
||||||
|
var s = e.innerHTML;
|
||||||
|
|
||||||
|
e.innerHTML = s[0] + " " + s.slice(1);
|
||||||
|
</script>
|
@@ -2,7 +2,7 @@ More on Updates
|
|||||||
===============
|
===============
|
||||||
|
|
||||||
Here we'll show some advanced usages when working with :doc:`update handlers <../start/updates>` and
|
Here we'll show some advanced usages when working with :doc:`update handlers <../start/updates>` and
|
||||||
:doc:`filters <filters>`.
|
:doc:`filters <use-filters>`.
|
||||||
|
|
||||||
Handler Groups
|
Handler Groups
|
||||||
--------------
|
--------------
|
||||||
|
@@ -105,93 +105,3 @@ More handlers using different filters can also live together.
|
|||||||
@app.on_message(Filters.chat("PyrogramChat"))
|
@app.on_message(Filters.chat("PyrogramChat"))
|
||||||
def from_pyrogramchat(client, message):
|
def from_pyrogramchat(client, message):
|
||||||
print("New message in @PyrogramChat")
|
print("New message in @PyrogramChat")
|
||||||
|
|
||||||
Custom Filters
|
|
||||||
--------------
|
|
||||||
|
|
||||||
Pyrogram already provides lots of built-in :class:`~pyrogram.Filters` to work with, but in case you can't find
|
|
||||||
a specific one for your needs or want to build a custom filter by yourself (to be used in a different kind of handler,
|
|
||||||
for example) you can use :meth:`~pyrogram.Filters.create`.
|
|
||||||
|
|
||||||
.. note::
|
|
||||||
|
|
||||||
At the moment, the built-in filters are intended to be used with the :class:`~pyrogram.MessageHandler` only.
|
|
||||||
|
|
||||||
An example to demonstrate how custom filters work is to show how to create and use one for the
|
|
||||||
:class:`~pyrogram.CallbackQueryHandler`. Note that callback queries updates are only received by bots; create and
|
|
||||||
:doc:`authorize your bot <../start/auth>`, then send a message with an inline keyboard to yourself. This allows you to
|
|
||||||
test your filter by pressing the inline button:
|
|
||||||
|
|
||||||
.. code-block:: python
|
|
||||||
|
|
||||||
from pyrogram import InlineKeyboardMarkup, InlineKeyboardButton
|
|
||||||
|
|
||||||
app.send_message(
|
|
||||||
"username", # Change this to your username or id
|
|
||||||
"Pyrogram's custom filter test",
|
|
||||||
reply_markup=InlineKeyboardMarkup(
|
|
||||||
[[InlineKeyboardButton("Press me", b"pyrogram")]]
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
Basic Filters
|
|
||||||
^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
For this basic filter we will be using only the first two parameters of :meth:`~pyrogram.Filters.create`.
|
|
||||||
|
|
||||||
The code below creates a simple filter for hardcoded, static callback data. This filter will only allow callback queries
|
|
||||||
containing "Pyrogram" as data, that is, the function *func* you pass returns True in case the callback query data
|
|
||||||
equals to ``b"Pyrogram"``.
|
|
||||||
|
|
||||||
.. code-block:: python
|
|
||||||
|
|
||||||
static_data = Filters.create(
|
|
||||||
name="StaticdData",
|
|
||||||
func=lambda flt, callback_query: callback_query.data == b"Pyrogram"
|
|
||||||
)
|
|
||||||
|
|
||||||
The ``lambda`` operator in python is used to create small anonymous functions and is perfect for this example, the same
|
|
||||||
could be achieved with a normal function, but we don't really need it as it makes sense only inside the filter's scope:
|
|
||||||
|
|
||||||
.. code-block:: python
|
|
||||||
|
|
||||||
def func(flt, callback_query):
|
|
||||||
return callback_query.data == b"Pyrogram"
|
|
||||||
|
|
||||||
static_data = Filters.create(
|
|
||||||
name="StaticData",
|
|
||||||
func=func
|
|
||||||
)
|
|
||||||
|
|
||||||
The filter usage remains the same:
|
|
||||||
|
|
||||||
.. code-block:: python
|
|
||||||
|
|
||||||
@app.on_callback_query(static_data)
|
|
||||||
def pyrogram_data(client, callback_query):
|
|
||||||
client.answer_callback_query(callback_query.id, "it works!")
|
|
||||||
|
|
||||||
Filters with Arguments
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
A much cooler filter would be one that accepts "Pyrogram" or any other data as argument at usage time.
|
|
||||||
A dynamic filter like this will make use of the third parameter of :meth:`~pyrogram.Filters.create`.
|
|
||||||
|
|
||||||
This is how a dynamic custom filter looks like:
|
|
||||||
|
|
||||||
.. code-block:: python
|
|
||||||
|
|
||||||
def dynamic_data(data):
|
|
||||||
return Filters.create(
|
|
||||||
name="DynamicData",
|
|
||||||
func=lambda flt, callback_query: flt.data == callback_query.data,
|
|
||||||
data=data # "data" kwarg is accessed with "filter.data"
|
|
||||||
)
|
|
||||||
|
|
||||||
And its usage:
|
|
||||||
|
|
||||||
.. code-block:: python
|
|
||||||
|
|
||||||
@app.on_callback_query(dynamic_data(b"Pyrogram"))
|
|
||||||
def pyrogram_data(client, callback_query):
|
|
||||||
client.answer_callback_query(callback_query.id, "it works!")
|
|
@@ -19,8 +19,8 @@
|
|||||||
from importlib import import_module
|
from importlib import import_module
|
||||||
|
|
||||||
from .all import objects
|
from .all import objects
|
||||||
from .core.object import Object
|
from .core.tl_object import TLObject
|
||||||
|
|
||||||
for k, v in objects.items():
|
for k, v in objects.items():
|
||||||
path, name = v.rsplit(".", 1)
|
path, name = v.rsplit(".", 1)
|
||||||
Object.all[k] = getattr(import_module(path), name)
|
TLObject.all[k] = getattr(import_module(path), name)
|
||||||
|
@@ -22,7 +22,7 @@ from .gzip_packed import GzipPacked
|
|||||||
from .list import List
|
from .list import List
|
||||||
from .message import Message
|
from .message import Message
|
||||||
from .msg_container import MsgContainer
|
from .msg_container import MsgContainer
|
||||||
from .object import Object
|
from .tl_object import TLObject
|
||||||
from .primitives import (
|
from .primitives import (
|
||||||
Bool, BoolTrue, BoolFalse, Bytes, Double,
|
Bool, BoolTrue, BoolFalse, Bytes, Double,
|
||||||
Int, Long, Int128, Int256, Null, String, Vector
|
Int, Long, Int128, Int256, Null, String, Vector
|
||||||
|
@@ -18,11 +18,11 @@
|
|||||||
|
|
||||||
from io import BytesIO
|
from io import BytesIO
|
||||||
|
|
||||||
from .object import Object
|
from .tl_object import TLObject
|
||||||
from .primitives import Int, Long
|
from .primitives import Int, Long
|
||||||
|
|
||||||
|
|
||||||
class FutureSalt(Object):
|
class FutureSalt(TLObject):
|
||||||
ID = 0x0949d9dc
|
ID = 0x0949d9dc
|
||||||
|
|
||||||
__slots__ = ["valid_since", "valid_until", "salt"]
|
__slots__ = ["valid_since", "valid_until", "salt"]
|
||||||
|
@@ -19,11 +19,11 @@
|
|||||||
from io import BytesIO
|
from io import BytesIO
|
||||||
|
|
||||||
from . import FutureSalt
|
from . import FutureSalt
|
||||||
from .object import Object
|
from .tl_object import TLObject
|
||||||
from .primitives import Int, Long
|
from .primitives import Int, Long
|
||||||
|
|
||||||
|
|
||||||
class FutureSalts(Object):
|
class FutureSalts(TLObject):
|
||||||
ID = 0xae500895
|
ID = 0xae500895
|
||||||
|
|
||||||
__slots__ = ["req_msg_id", "now", "salts"]
|
__slots__ = ["req_msg_id", "now", "salts"]
|
||||||
|
@@ -19,24 +19,24 @@
|
|||||||
from gzip import compress, decompress
|
from gzip import compress, decompress
|
||||||
from io import BytesIO
|
from io import BytesIO
|
||||||
|
|
||||||
from .object import Object
|
from .tl_object import TLObject
|
||||||
from .primitives import Int, Bytes
|
from .primitives import Int, Bytes
|
||||||
|
|
||||||
|
|
||||||
class GzipPacked(Object):
|
class GzipPacked(TLObject):
|
||||||
ID = 0x3072cfa1
|
ID = 0x3072cfa1
|
||||||
|
|
||||||
__slots__ = ["packed_data"]
|
__slots__ = ["packed_data"]
|
||||||
|
|
||||||
QUALNAME = "GzipPacked"
|
QUALNAME = "GzipPacked"
|
||||||
|
|
||||||
def __init__(self, packed_data: Object):
|
def __init__(self, packed_data: TLObject):
|
||||||
self.packed_data = packed_data
|
self.packed_data = packed_data
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def read(b: BytesIO, *args) -> "GzipPacked":
|
def read(b: BytesIO, *args) -> "GzipPacked":
|
||||||
# Return the Object itself instead of a GzipPacked wrapping it
|
# Return the Object itself instead of a GzipPacked wrapping it
|
||||||
return Object.read(
|
return TLObject.read(
|
||||||
BytesIO(
|
BytesIO(
|
||||||
decompress(
|
decompress(
|
||||||
Bytes.read(b)
|
Bytes.read(b)
|
||||||
|
@@ -16,13 +16,13 @@
|
|||||||
# You should have received a copy of the GNU Lesser General Public License
|
# You should have received a copy of the GNU Lesser General Public License
|
||||||
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
from .object import Object
|
from .tl_object import TLObject
|
||||||
|
|
||||||
|
|
||||||
class List(list, Object):
|
class List(list, TLObject):
|
||||||
__slots__ = []
|
__slots__ = []
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return "pyrogram.api.core.List([{}])".format(
|
return "pyrogram.api.core.List([{}])".format(
|
||||||
",".join(Object.__repr__(i) for i in self)
|
",".join(TLObject.__repr__(i) for i in self)
|
||||||
)
|
)
|
||||||
|
@@ -18,18 +18,18 @@
|
|||||||
|
|
||||||
from io import BytesIO
|
from io import BytesIO
|
||||||
|
|
||||||
from .object import Object
|
from .tl_object import TLObject
|
||||||
from .primitives import Int, Long
|
from .primitives import Int, Long
|
||||||
|
|
||||||
|
|
||||||
class Message(Object):
|
class Message(TLObject):
|
||||||
ID = 0x5bb8e511 # hex(crc32(b"message msg_id:long seqno:int bytes:int body:Object = Message"))
|
ID = 0x5bb8e511 # hex(crc32(b"message msg_id:long seqno:int bytes:int body:Object = Message"))
|
||||||
|
|
||||||
__slots__ = ["msg_id", "seq_no", "length", "body"]
|
__slots__ = ["msg_id", "seq_no", "length", "body"]
|
||||||
|
|
||||||
QUALNAME = "Message"
|
QUALNAME = "Message"
|
||||||
|
|
||||||
def __init__(self, body: Object, msg_id: int, seq_no: int, length: int):
|
def __init__(self, body: TLObject, msg_id: int, seq_no: int, length: int):
|
||||||
self.msg_id = msg_id
|
self.msg_id = msg_id
|
||||||
self.seq_no = seq_no
|
self.seq_no = seq_no
|
||||||
self.length = length
|
self.length = length
|
||||||
@@ -42,7 +42,7 @@ class Message(Object):
|
|||||||
length = Int.read(b)
|
length = Int.read(b)
|
||||||
body = b.read(length)
|
body = b.read(length)
|
||||||
|
|
||||||
return Message(Object.read(BytesIO(body)), msg_id, seq_no, length)
|
return Message(TLObject.read(BytesIO(body)), msg_id, seq_no, length)
|
||||||
|
|
||||||
def write(self) -> bytes:
|
def write(self) -> bytes:
|
||||||
b = BytesIO()
|
b = BytesIO()
|
||||||
|
@@ -19,11 +19,11 @@
|
|||||||
from io import BytesIO
|
from io import BytesIO
|
||||||
|
|
||||||
from .message import Message
|
from .message import Message
|
||||||
from .object import Object
|
from .tl_object import TLObject
|
||||||
from .primitives import Int
|
from .primitives import Int
|
||||||
|
|
||||||
|
|
||||||
class MsgContainer(Object):
|
class MsgContainer(TLObject):
|
||||||
ID = 0x73f1f8dc
|
ID = 0x73f1f8dc
|
||||||
|
|
||||||
__slots__ = ["messages"]
|
__slots__ = ["messages"]
|
||||||
|
@@ -18,10 +18,10 @@
|
|||||||
|
|
||||||
from io import BytesIO
|
from io import BytesIO
|
||||||
|
|
||||||
from ..object import Object
|
from ..tl_object import TLObject
|
||||||
|
|
||||||
|
|
||||||
class BoolFalse(Object):
|
class BoolFalse(TLObject):
|
||||||
ID = 0xbc799737
|
ID = 0xbc799737
|
||||||
value = False
|
value = False
|
||||||
|
|
||||||
@@ -38,7 +38,7 @@ class BoolTrue(BoolFalse):
|
|||||||
value = True
|
value = True
|
||||||
|
|
||||||
|
|
||||||
class Bool(Object):
|
class Bool(TLObject):
|
||||||
@classmethod
|
@classmethod
|
||||||
def read(cls, b: BytesIO) -> bool:
|
def read(cls, b: BytesIO) -> bool:
|
||||||
return int.from_bytes(b.read(4), "little") == BoolTrue.ID
|
return int.from_bytes(b.read(4), "little") == BoolTrue.ID
|
||||||
|
@@ -18,10 +18,10 @@
|
|||||||
|
|
||||||
from io import BytesIO
|
from io import BytesIO
|
||||||
|
|
||||||
from ..object import Object
|
from ..tl_object import TLObject
|
||||||
|
|
||||||
|
|
||||||
class Bytes(Object):
|
class Bytes(TLObject):
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def read(b: BytesIO, *args) -> bytes:
|
def read(b: BytesIO, *args) -> bytes:
|
||||||
length = int.from_bytes(b.read(1), "little")
|
length = int.from_bytes(b.read(1), "little")
|
||||||
|
@@ -19,10 +19,10 @@
|
|||||||
from io import BytesIO
|
from io import BytesIO
|
||||||
from struct import unpack, pack
|
from struct import unpack, pack
|
||||||
|
|
||||||
from ..object import Object
|
from ..tl_object import TLObject
|
||||||
|
|
||||||
|
|
||||||
class Double(Object):
|
class Double(TLObject):
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def read(b: BytesIO, *args) -> float:
|
def read(b: BytesIO, *args) -> float:
|
||||||
return unpack("d", b.read(8))[0]
|
return unpack("d", b.read(8))[0]
|
||||||
|
@@ -18,10 +18,10 @@
|
|||||||
|
|
||||||
from io import BytesIO
|
from io import BytesIO
|
||||||
|
|
||||||
from ..object import Object
|
from ..tl_object import TLObject
|
||||||
|
|
||||||
|
|
||||||
class Int(Object):
|
class Int(TLObject):
|
||||||
SIZE = 4
|
SIZE = 4
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
@@ -18,10 +18,10 @@
|
|||||||
|
|
||||||
from io import BytesIO
|
from io import BytesIO
|
||||||
|
|
||||||
from ..object import Object
|
from ..tl_object import TLObject
|
||||||
|
|
||||||
|
|
||||||
class Null(Object):
|
class Null(TLObject):
|
||||||
ID = 0x56730bcc
|
ID = 0x56730bcc
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
@@ -20,31 +20,31 @@ from io import BytesIO
|
|||||||
|
|
||||||
from . import Int
|
from . import Int
|
||||||
from ..list import List
|
from ..list import List
|
||||||
from ..object import Object
|
from ..tl_object import TLObject
|
||||||
|
|
||||||
|
|
||||||
class Vector(Object):
|
class Vector(TLObject):
|
||||||
ID = 0x1cb5c415
|
ID = 0x1cb5c415
|
||||||
|
|
||||||
# Method added to handle the special case when a query returns a bare Vector (of Ints);
|
# Method added to handle the special case when a query returns a bare Vector (of Ints);
|
||||||
# i.e., RpcResult body starts with 0x1cb5c415 (Vector Id) - e.g., messages.GetMessagesViews.
|
# i.e., RpcResult body starts with 0x1cb5c415 (Vector Id) - e.g., messages.GetMessagesViews.
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _read(b: BytesIO) -> Object or int:
|
def _read(b: BytesIO) -> TLObject or int:
|
||||||
try:
|
try:
|
||||||
return Object.read(b)
|
return TLObject.read(b)
|
||||||
except KeyError:
|
except KeyError:
|
||||||
b.seek(-4, 1)
|
b.seek(-4, 1)
|
||||||
return Int.read(b)
|
return Int.read(b)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def read(b: BytesIO, t: Object = None) -> list:
|
def read(b: BytesIO, t: TLObject = None) -> list:
|
||||||
return List(
|
return List(
|
||||||
t.read(b) if t
|
t.read(b) if t
|
||||||
else Vector._read(b)
|
else Vector._read(b)
|
||||||
for _ in range(Int.read(b))
|
for _ in range(Int.read(b))
|
||||||
)
|
)
|
||||||
|
|
||||||
def __new__(cls, value: list, t: Object = None) -> bytes:
|
def __new__(cls, value: list, t: TLObject = None) -> bytes:
|
||||||
return b"".join(
|
return b"".join(
|
||||||
[Int(cls.ID, False), Int(len(value))]
|
[Int(cls.ID, False), Int(len(value))]
|
||||||
+ [
|
+ [
|
||||||
|
@@ -21,7 +21,7 @@ from io import BytesIO
|
|||||||
from json import dumps
|
from json import dumps
|
||||||
|
|
||||||
|
|
||||||
class Object:
|
class TLObject:
|
||||||
all = {}
|
all = {}
|
||||||
|
|
||||||
__slots__ = []
|
__slots__ = []
|
||||||
@@ -30,13 +30,13 @@ class Object:
|
|||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def read(b: BytesIO, *args): # TODO: Rename b -> data
|
def read(b: BytesIO, *args): # TODO: Rename b -> data
|
||||||
return Object.all[int.from_bytes(b.read(4), "little")].read(b, *args)
|
return TLObject.all[int.from_bytes(b.read(4), "little")].read(b, *args)
|
||||||
|
|
||||||
def write(self, *args) -> bytes:
|
def write(self, *args) -> bytes:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def default(obj: "Object"):
|
def default(obj: "TLObject"):
|
||||||
if isinstance(obj, bytes):
|
if isinstance(obj, bytes):
|
||||||
return repr(obj)
|
return repr(obj)
|
||||||
|
|
||||||
@@ -50,7 +50,7 @@ class Object:
|
|||||||
)
|
)
|
||||||
|
|
||||||
def __str__(self) -> str:
|
def __str__(self) -> str:
|
||||||
return dumps(self, indent=4, default=Object.default, ensure_ascii=False)
|
return dumps(self, indent=4, default=TLObject.default, ensure_ascii=False)
|
||||||
|
|
||||||
def __repr__(self) -> str:
|
def __repr__(self) -> str:
|
||||||
return "pyrogram.api.{}({})".format(
|
return "pyrogram.api.{}({})".format(
|
||||||
@@ -62,7 +62,7 @@ class Object:
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
def __eq__(self, other: "Object") -> bool:
|
def __eq__(self, other: "TLObject") -> bool:
|
||||||
for attr in self.__slots__:
|
for attr in self.__slots__:
|
||||||
try:
|
try:
|
||||||
if getattr(self, attr) != getattr(other, attr):
|
if getattr(self, attr) != getattr(other, attr):
|
||||||
@@ -77,3 +77,6 @@ class Object:
|
|||||||
|
|
||||||
def __getitem__(self, item):
|
def __getitem__(self, item):
|
||||||
return getattr(self, item)
|
return getattr(self, item)
|
||||||
|
|
||||||
|
def __setitem__(self, key, value):
|
||||||
|
setattr(self, key, value)
|
@@ -37,7 +37,7 @@ from signal import signal, SIGINT, SIGTERM, SIGABRT
|
|||||||
from typing import Union, List
|
from typing import Union, List
|
||||||
|
|
||||||
from pyrogram.api import functions, types
|
from pyrogram.api import functions, types
|
||||||
from pyrogram.api.core import Object
|
from pyrogram.api.core import TLObject
|
||||||
from pyrogram.client.handlers import DisconnectHandler
|
from pyrogram.client.handlers import DisconnectHandler
|
||||||
from pyrogram.client.handlers.handler import Handler
|
from pyrogram.client.handlers.handler import Handler
|
||||||
from pyrogram.client.methods.password.utils import compute_check
|
from pyrogram.client.methods.password.utils import compute_check
|
||||||
@@ -1003,7 +1003,7 @@ class Client(Methods, BaseClient):
|
|||||||
log.info("UpdatesWorkerTask stopped")
|
log.info("UpdatesWorkerTask stopped")
|
||||||
|
|
||||||
async def send(self,
|
async def send(self,
|
||||||
data: Object,
|
data: TLObject,
|
||||||
retries: int = Session.MAX_RETRIES,
|
retries: int = Session.MAX_RETRIES,
|
||||||
timeout: float = Session.WAIT_TIMEOUT):
|
timeout: float = Session.WAIT_TIMEOUT):
|
||||||
"""Send raw Telegram queries.
|
"""Send raw Telegram queries.
|
||||||
|
@@ -54,7 +54,7 @@ class ExportChatInviteLink(BaseClient):
|
|||||||
if isinstance(peer, types.InputPeerChat):
|
if isinstance(peer, types.InputPeerChat):
|
||||||
return await self.send(
|
return await self.send(
|
||||||
functions.messages.ExportChatInvite(
|
functions.messages.ExportChatInvite(
|
||||||
peer=peer.chat_id
|
peer=peer
|
||||||
)
|
)
|
||||||
).link
|
).link
|
||||||
elif isinstance(peer, types.InputPeerChannel):
|
elif isinstance(peer, types.InputPeerChannel):
|
||||||
|
@@ -27,6 +27,7 @@ from .get_history import GetHistory
|
|||||||
from .get_history_count import GetHistoryCount
|
from .get_history_count import GetHistoryCount
|
||||||
from .get_messages import GetMessages
|
from .get_messages import GetMessages
|
||||||
from .iter_history import IterHistory
|
from .iter_history import IterHistory
|
||||||
|
from .read_history import ReadHistory
|
||||||
from .retract_vote import RetractVote
|
from .retract_vote import RetractVote
|
||||||
from .send_animated_sticker import SendAnimatedSticker
|
from .send_animated_sticker import SendAnimatedSticker
|
||||||
from .send_animation import SendAnimation
|
from .send_animation import SendAnimation
|
||||||
@@ -80,6 +81,7 @@ class Messages(
|
|||||||
IterHistory,
|
IterHistory,
|
||||||
SendCachedMedia,
|
SendCachedMedia,
|
||||||
GetHistoryCount,
|
GetHistoryCount,
|
||||||
SendAnimatedSticker
|
SendAnimatedSticker,
|
||||||
|
ReadHistory
|
||||||
):
|
):
|
||||||
pass
|
pass
|
||||||
|
65
pyrogram/client/methods/messages/read_history.py
Normal file
65
pyrogram/client/methods/messages/read_history.py
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
# Pyrogram - Telegram MTProto API Client Library for Python
|
||||||
|
# Copyright (C) 2017-2019 Dan Tès <https://github.com/delivrance>
|
||||||
|
#
|
||||||
|
# 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 <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
from typing import Union
|
||||||
|
|
||||||
|
from pyrogram.api import functions, types
|
||||||
|
from ...ext import BaseClient
|
||||||
|
|
||||||
|
|
||||||
|
class ReadHistory(BaseClient):
|
||||||
|
def read_history(
|
||||||
|
self,
|
||||||
|
chat_id: Union[int, str],
|
||||||
|
max_id: int = 0
|
||||||
|
) -> bool:
|
||||||
|
"""Mark a chat's message history as read.
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
chat_id (``int`` | ``str``):
|
||||||
|
Unique identifier (int) or username (str) of the target chat.
|
||||||
|
For your personal cloud (Saved Messages) you can simply use "me" or "self".
|
||||||
|
For a contact that exists in your Telegram address book you can use his phone number (str).
|
||||||
|
|
||||||
|
max_id (``int``, *optional*):
|
||||||
|
The id of the last message you want to mark as read; all the messages before this one will be marked as
|
||||||
|
read as well. Defaults to 0 (mark every unread message as read).
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
``bool`` - On success, True is returned.
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
RPCError: In case of a Telegram RPC error.
|
||||||
|
"""
|
||||||
|
|
||||||
|
peer = self.resolve_peer(chat_id)
|
||||||
|
|
||||||
|
if isinstance(peer, types.InputPeerChannel):
|
||||||
|
q = functions.channels.ReadHistory(
|
||||||
|
channel=peer,
|
||||||
|
max_id=max_id
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
q = functions.messages.ReadHistory(
|
||||||
|
peer=peer,
|
||||||
|
max_id=max_id
|
||||||
|
)
|
||||||
|
|
||||||
|
self.send(q)
|
||||||
|
|
||||||
|
return True
|
@@ -31,6 +31,7 @@ class SendAnimation(BaseClient):
|
|||||||
chat_id: Union[int, str],
|
chat_id: Union[int, str],
|
||||||
animation: str,
|
animation: str,
|
||||||
caption: str = "",
|
caption: str = "",
|
||||||
|
unsave: bool = False,
|
||||||
parse_mode: str = "",
|
parse_mode: str = "",
|
||||||
duration: int = 0,
|
duration: int = 0,
|
||||||
width: int = 0,
|
width: int = 0,
|
||||||
@@ -64,6 +65,10 @@ class SendAnimation(BaseClient):
|
|||||||
caption (``str``, *optional*):
|
caption (``str``, *optional*):
|
||||||
Animation caption, 0-1024 characters.
|
Animation caption, 0-1024 characters.
|
||||||
|
|
||||||
|
unsave (``bool``, *optional*):
|
||||||
|
By default, the server will save into your own collection any new animation GIF you send.
|
||||||
|
Pass True to automatically unsave the sent animation. Defaults to False.
|
||||||
|
|
||||||
parse_mode (``str``, *optional*):
|
parse_mode (``str``, *optional*):
|
||||||
Pass "markdown" or "html" if you want Telegram apps to show bold, italic, fixed-width text or inline
|
Pass "markdown" or "html" if you want Telegram apps to show bold, italic, fixed-width text or inline
|
||||||
URLs in your caption. Defaults to "markdown".
|
URLs in your caption. Defaults to "markdown".
|
||||||
@@ -171,10 +176,24 @@ class SendAnimation(BaseClient):
|
|||||||
else:
|
else:
|
||||||
for i in r.updates:
|
for i in r.updates:
|
||||||
if isinstance(i, (types.UpdateNewMessage, types.UpdateNewChannelMessage)):
|
if isinstance(i, (types.UpdateNewMessage, types.UpdateNewChannelMessage)):
|
||||||
return await pyrogram.Message._parse(
|
message = await pyrogram.Message._parse(
|
||||||
self, i.message,
|
self, i.message,
|
||||||
{i.id: i for i in r.users},
|
{i.id: i for i in r.users},
|
||||||
{i.id: i for i in r.chats}
|
{i.id: i for i in r.chats}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if unsave:
|
||||||
|
document = message.animation or message.document
|
||||||
|
document_id = utils.get_input_media_from_file_id(document.file_id).id
|
||||||
|
|
||||||
|
await self.send(
|
||||||
|
functions.messages.SaveGif(
|
||||||
|
id=document_id,
|
||||||
|
unsave=True
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
return message
|
||||||
|
|
||||||
except BaseClient.StopTransmission:
|
except BaseClient.StopTransmission:
|
||||||
return None
|
return None
|
||||||
|
@@ -22,12 +22,12 @@ import pyrogram
|
|||||||
from pyrogram.api import types
|
from pyrogram.api import types
|
||||||
from .inline_query_result import InlineQueryResult
|
from .inline_query_result import InlineQueryResult
|
||||||
from ..messages_and_media import Location
|
from ..messages_and_media import Location
|
||||||
from ..pyrogram_type import PyrogramType
|
from ..object import Object
|
||||||
from ..update import Update
|
from ..update import Update
|
||||||
from ..user_and_chats import User
|
from ..user_and_chats import User
|
||||||
|
|
||||||
|
|
||||||
class InlineQuery(PyrogramType, Update):
|
class InlineQuery(Object, Update):
|
||||||
"""An incoming inline query.
|
"""An incoming inline query.
|
||||||
|
|
||||||
When the user sends an empty query, your bot could return some default or trending results.
|
When the user sends an empty query, your bot could return some default or trending results.
|
||||||
|
@@ -16,7 +16,7 @@
|
|||||||
# You should have received a copy of the GNU Lesser General Public License
|
# You should have received a copy of the GNU Lesser General Public License
|
||||||
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
from ..pyrogram_type import PyrogramType
|
from ..object import Object
|
||||||
|
|
||||||
"""- :obj:`InlineQueryResultCachedAudio`
|
"""- :obj:`InlineQueryResultCachedAudio`
|
||||||
- :obj:`InlineQueryResultCachedDocument`
|
- :obj:`InlineQueryResultCachedDocument`
|
||||||
@@ -39,7 +39,7 @@ from ..pyrogram_type import PyrogramType
|
|||||||
- :obj:`InlineQueryResultVoice`"""
|
- :obj:`InlineQueryResultVoice`"""
|
||||||
|
|
||||||
|
|
||||||
class InlineQueryResult(PyrogramType):
|
class InlineQueryResult(Object):
|
||||||
"""One result of an inline query.
|
"""One result of an inline query.
|
||||||
|
|
||||||
Pyrogram currently supports results of the following 20 types:
|
Pyrogram currently supports results of the following 20 types:
|
||||||
|
@@ -16,10 +16,10 @@
|
|||||||
# You should have received a copy of the GNU Lesser General Public License
|
# You should have received a copy of the GNU Lesser General Public License
|
||||||
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
from pyrogram.client.types.pyrogram_type import PyrogramType
|
from pyrogram.client.types.object import Object
|
||||||
|
|
||||||
|
|
||||||
class InlineQueryResultAudio(PyrogramType):
|
class InlineQueryResultAudio(Object):
|
||||||
"""Represents a link to an mp3 audio file. By default, this audio file will be sent by the user. Alternatively, you can use input_message_content to send a message with the specified content instead of the audio.
|
"""Represents a link to an mp3 audio file. By default, this audio file will be sent by the user. Alternatively, you can use input_message_content to send a message with the specified content instead of the audio.
|
||||||
|
|
||||||
Attributes:
|
Attributes:
|
||||||
|
@@ -23,10 +23,10 @@ from pyrogram.api import types
|
|||||||
from pyrogram.errors import FileIdInvalid
|
from pyrogram.errors import FileIdInvalid
|
||||||
from pyrogram.client.ext import utils, BaseClient
|
from pyrogram.client.ext import utils, BaseClient
|
||||||
from pyrogram.client.style import HTML, Markdown
|
from pyrogram.client.style import HTML, Markdown
|
||||||
from pyrogram.client.types.pyrogram_type import PyrogramType
|
from pyrogram.client.types.object import Object
|
||||||
|
|
||||||
|
|
||||||
class InlineQueryResultCachedAudio(PyrogramType):
|
class InlineQueryResultCachedAudio(Object):
|
||||||
"""Represents a link to an audio file stored on the Telegram servers.
|
"""Represents a link to an audio file stored on the Telegram servers.
|
||||||
By default, this audio file will be sent by the user. Alternatively, you can use *input_message_content* to send a
|
By default, this audio file will be sent by the user. Alternatively, you can use *input_message_content* to send a
|
||||||
message with the specified content instead of the audio.
|
message with the specified content instead of the audio.
|
||||||
|
@@ -16,10 +16,10 @@
|
|||||||
# You should have received a copy of the GNU Lesser General Public License
|
# You should have received a copy of the GNU Lesser General Public License
|
||||||
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
from pyrogram.client.types.pyrogram_type import PyrogramType
|
from pyrogram.client.types.object import Object
|
||||||
|
|
||||||
|
|
||||||
class InlineQueryResultCachedDocument(PyrogramType):
|
class InlineQueryResultCachedDocument(Object):
|
||||||
"""Represents a link to a file stored on the Telegram servers. By default, this file will be sent by the user with an optional caption. Alternatively, you can use input_message_content to send a message with the specified content instead of the file.
|
"""Represents a link to a file stored on the Telegram servers. By default, this file will be sent by the user with an optional caption. Alternatively, you can use input_message_content to send a message with the specified content instead of the file.
|
||||||
|
|
||||||
Attributes:
|
Attributes:
|
||||||
|
@@ -16,10 +16,10 @@
|
|||||||
# You should have received a copy of the GNU Lesser General Public License
|
# You should have received a copy of the GNU Lesser General Public License
|
||||||
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
from pyrogram.client.types.pyrogram_type import PyrogramType
|
from pyrogram.client.types.object import Object
|
||||||
|
|
||||||
|
|
||||||
class InlineQueryResultCachedGif(PyrogramType):
|
class InlineQueryResultCachedGif(Object):
|
||||||
"""Represents a link to an animated GIF file stored on the Telegram servers. By default, this animated GIF file will be sent by the user with an optional caption. Alternatively, you can use input_message_content to send a message with specified content instead of the animation.
|
"""Represents a link to an animated GIF file stored on the Telegram servers. By default, this animated GIF file will be sent by the user with an optional caption. Alternatively, you can use input_message_content to send a message with specified content instead of the animation.
|
||||||
|
|
||||||
Attributes:
|
Attributes:
|
||||||
|
@@ -16,10 +16,10 @@
|
|||||||
# You should have received a copy of the GNU Lesser General Public License
|
# You should have received a copy of the GNU Lesser General Public License
|
||||||
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
from pyrogram.client.types.pyrogram_type import PyrogramType
|
from pyrogram.client.types.object import Object
|
||||||
|
|
||||||
|
|
||||||
class InlineQueryResultCachedMpeg4Gif(PyrogramType):
|
class InlineQueryResultCachedMpeg4Gif(Object):
|
||||||
"""Represents a link to a video animation (H.264/MPEG-4 AVC video without sound) stored on the Telegram servers. By default, this animated MPEG-4 file will be sent by the user with an optional caption. Alternatively, you can use input_message_content to send a message with the specified content instead of the animation.
|
"""Represents a link to a video animation (H.264/MPEG-4 AVC video without sound) stored on the Telegram servers. By default, this animated MPEG-4 file will be sent by the user with an optional caption. Alternatively, you can use input_message_content to send a message with the specified content instead of the animation.
|
||||||
|
|
||||||
Attributes:
|
Attributes:
|
||||||
|
@@ -16,10 +16,10 @@
|
|||||||
# You should have received a copy of the GNU Lesser General Public License
|
# You should have received a copy of the GNU Lesser General Public License
|
||||||
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
from pyrogram.client.types.pyrogram_type import PyrogramType
|
from pyrogram.client.types.object import Object
|
||||||
|
|
||||||
|
|
||||||
class InlineQueryResultCachedPhoto(PyrogramType):
|
class InlineQueryResultCachedPhoto(Object):
|
||||||
"""Represents a link to a photo stored on the Telegram servers. By default, this photo will be sent by the user with an optional caption. Alternatively, you can use input_message_content to send a message with the specified content instead of the photo.
|
"""Represents a link to a photo stored on the Telegram servers. By default, this photo will be sent by the user with an optional caption. Alternatively, you can use input_message_content to send a message with the specified content instead of the photo.
|
||||||
|
|
||||||
Attributes:
|
Attributes:
|
||||||
|
@@ -16,10 +16,10 @@
|
|||||||
# You should have received a copy of the GNU Lesser General Public License
|
# You should have received a copy of the GNU Lesser General Public License
|
||||||
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
from pyrogram.client.types.pyrogram_type import PyrogramType
|
from pyrogram.client.types.object import Object
|
||||||
|
|
||||||
|
|
||||||
class InlineQueryResultCachedSticker(PyrogramType):
|
class InlineQueryResultCachedSticker(Object):
|
||||||
"""Represents a link to a sticker stored on the Telegram servers. By default, this sticker will be sent by the user. Alternatively, you can use input_message_content to send a message with the specified content instead of the sticker.
|
"""Represents a link to a sticker stored on the Telegram servers. By default, this sticker will be sent by the user. Alternatively, you can use input_message_content to send a message with the specified content instead of the sticker.
|
||||||
|
|
||||||
Attributes:
|
Attributes:
|
||||||
|
@@ -16,10 +16,10 @@
|
|||||||
# You should have received a copy of the GNU Lesser General Public License
|
# You should have received a copy of the GNU Lesser General Public License
|
||||||
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
from pyrogram.client.types.pyrogram_type import PyrogramType
|
from pyrogram.client.types.object import Object
|
||||||
|
|
||||||
|
|
||||||
class InlineQueryResultCachedVideo(PyrogramType):
|
class InlineQueryResultCachedVideo(Object):
|
||||||
"""Represents a link to a video file stored on the Telegram servers. By default, this video file will be sent by the user with an optional caption. Alternatively, you can use input_message_content to send a message with the specified content instead of the video.
|
"""Represents a link to a video file stored on the Telegram servers. By default, this video file will be sent by the user with an optional caption. Alternatively, you can use input_message_content to send a message with the specified content instead of the video.
|
||||||
|
|
||||||
Attributes:
|
Attributes:
|
||||||
|
@@ -16,10 +16,10 @@
|
|||||||
# You should have received a copy of the GNU Lesser General Public License
|
# You should have received a copy of the GNU Lesser General Public License
|
||||||
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
from pyrogram.client.types.pyrogram_type import PyrogramType
|
from pyrogram.client.types.object import Object
|
||||||
|
|
||||||
|
|
||||||
class InlineQueryResultCachedVoice(PyrogramType):
|
class InlineQueryResultCachedVoice(Object):
|
||||||
"""Represents a link to a voice message stored on the Telegram servers. By default, this voice message will be sent by the user. Alternatively, you can use input_message_content to send a message with the specified content instead of the voice message.
|
"""Represents a link to a voice message stored on the Telegram servers. By default, this voice message will be sent by the user. Alternatively, you can use input_message_content to send a message with the specified content instead of the voice message.
|
||||||
|
|
||||||
Attributes:
|
Attributes:
|
||||||
|
@@ -16,10 +16,10 @@
|
|||||||
# You should have received a copy of the GNU Lesser General Public License
|
# You should have received a copy of the GNU Lesser General Public License
|
||||||
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
from pyrogram.client.types.pyrogram_type import PyrogramType
|
from pyrogram.client.types.object import Object
|
||||||
|
|
||||||
|
|
||||||
class InlineQueryResultContact(PyrogramType):
|
class InlineQueryResultContact(Object):
|
||||||
"""Represents a contact with a phone number. By default, this contact will be sent by the user. Alternatively, you can use input_message_content to send a message with the specified content instead of the contact.
|
"""Represents a contact with a phone number. By default, this contact will be sent by the user. Alternatively, you can use input_message_content to send a message with the specified content instead of the contact.
|
||||||
|
|
||||||
Attributes:
|
Attributes:
|
||||||
|
@@ -16,10 +16,10 @@
|
|||||||
# You should have received a copy of the GNU Lesser General Public License
|
# You should have received a copy of the GNU Lesser General Public License
|
||||||
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
from pyrogram.client.types.pyrogram_type import PyrogramType
|
from pyrogram.client.types.object import Object
|
||||||
|
|
||||||
|
|
||||||
class InlineQueryResultDocument(PyrogramType):
|
class InlineQueryResultDocument(Object):
|
||||||
"""Represents a link to a file. By default, this file will be sent by the user with an optional caption. Alternatively, you can use input_message_content to send a message with the specified content instead of the file. Currently, only .PDF and .ZIP files can be sent using this method.
|
"""Represents a link to a file. By default, this file will be sent by the user with an optional caption. Alternatively, you can use input_message_content to send a message with the specified content instead of the file. Currently, only .PDF and .ZIP files can be sent using this method.
|
||||||
|
|
||||||
Attributes:
|
Attributes:
|
||||||
|
@@ -16,10 +16,10 @@
|
|||||||
# You should have received a copy of the GNU Lesser General Public License
|
# You should have received a copy of the GNU Lesser General Public License
|
||||||
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
from pyrogram.client.types.pyrogram_type import PyrogramType
|
from pyrogram.client.types.object import Object
|
||||||
|
|
||||||
|
|
||||||
class InlineQueryResultGame(PyrogramType):
|
class InlineQueryResultGame(Object):
|
||||||
"""Represents a Game.
|
"""Represents a Game.
|
||||||
|
|
||||||
Attributes:
|
Attributes:
|
||||||
|
@@ -16,10 +16,10 @@
|
|||||||
# You should have received a copy of the GNU Lesser General Public License
|
# You should have received a copy of the GNU Lesser General Public License
|
||||||
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
from pyrogram.client.types.pyrogram_type import PyrogramType
|
from pyrogram.client.types.object import Object
|
||||||
|
|
||||||
|
|
||||||
class InlineQueryResultGif(PyrogramType):
|
class InlineQueryResultGif(Object):
|
||||||
"""Represents a link to an animated GIF file. By default, this animated GIF file will be sent by the user with optional caption. Alternatively, you can use input_message_content to send a message with the specified content instead of the animation.
|
"""Represents a link to an animated GIF file. By default, this animated GIF file will be sent by the user with optional caption. Alternatively, you can use input_message_content to send a message with the specified content instead of the animation.
|
||||||
|
|
||||||
Attributes:
|
Attributes:
|
||||||
|
@@ -16,10 +16,10 @@
|
|||||||
# You should have received a copy of the GNU Lesser General Public License
|
# You should have received a copy of the GNU Lesser General Public License
|
||||||
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
from pyrogram.client.types.pyrogram_type import PyrogramType
|
from pyrogram.client.types.object import Object
|
||||||
|
|
||||||
|
|
||||||
class InlineQueryResultLocation(PyrogramType):
|
class InlineQueryResultLocation(Object):
|
||||||
"""Represents a location on a map. By default, the location will be sent by the user. Alternatively, you can use input_message_content to send a message with the specified content instead of the location.
|
"""Represents a location on a map. By default, the location will be sent by the user. Alternatively, you can use input_message_content to send a message with the specified content instead of the location.
|
||||||
|
|
||||||
Attributes:
|
Attributes:
|
||||||
|
@@ -16,10 +16,10 @@
|
|||||||
# You should have received a copy of the GNU Lesser General Public License
|
# You should have received a copy of the GNU Lesser General Public License
|
||||||
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
from pyrogram.client.types.pyrogram_type import PyrogramType
|
from pyrogram.client.types.object import Object
|
||||||
|
|
||||||
|
|
||||||
class InlineQueryResultMpeg4Gif(PyrogramType):
|
class InlineQueryResultMpeg4Gif(Object):
|
||||||
"""Represents a link to a video animation (H.264/MPEG-4 AVC video without sound). By default, this animated MPEG-4 file will be sent by the user with optional caption. Alternatively, you can use input_message_content to send a message with the specified content instead of the animation.
|
"""Represents a link to a video animation (H.264/MPEG-4 AVC video without sound). By default, this animated MPEG-4 file will be sent by the user with optional caption. Alternatively, you can use input_message_content to send a message with the specified content instead of the animation.
|
||||||
|
|
||||||
Attributes:
|
Attributes:
|
||||||
|
@@ -18,10 +18,10 @@
|
|||||||
|
|
||||||
from pyrogram.api import types
|
from pyrogram.api import types
|
||||||
from pyrogram.client.style import HTML, Markdown
|
from pyrogram.client.style import HTML, Markdown
|
||||||
from pyrogram.client.types.pyrogram_type import PyrogramType
|
from pyrogram.client.types.object import Object
|
||||||
|
|
||||||
|
|
||||||
class InlineQueryResultPhoto(PyrogramType):
|
class InlineQueryResultPhoto(Object):
|
||||||
"""Represents a link to a photo. By default, this photo will be sent by the user with optional caption.
|
"""Represents a link to a photo. By default, this photo will be sent by the user with optional caption.
|
||||||
Alternatively, you can use input_message_content to send a message with the specified content instead of the photo.
|
Alternatively, you can use input_message_content to send a message with the specified content instead of the photo.
|
||||||
|
|
||||||
|
@@ -16,10 +16,10 @@
|
|||||||
# You should have received a copy of the GNU Lesser General Public License
|
# You should have received a copy of the GNU Lesser General Public License
|
||||||
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
from pyrogram.client.types.pyrogram_type import PyrogramType
|
from pyrogram.client.types.object import Object
|
||||||
|
|
||||||
|
|
||||||
class InlineQueryResultVenue(PyrogramType):
|
class InlineQueryResultVenue(Object):
|
||||||
"""Represents a venue. By default, the venue will be sent by the user. Alternatively, you can use input_message_content to send a message with the specified content instead of the venue.
|
"""Represents a venue. By default, the venue will be sent by the user. Alternatively, you can use input_message_content to send a message with the specified content instead of the venue.
|
||||||
|
|
||||||
Attributes:
|
Attributes:
|
||||||
|
@@ -16,10 +16,10 @@
|
|||||||
# You should have received a copy of the GNU Lesser General Public License
|
# You should have received a copy of the GNU Lesser General Public License
|
||||||
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
from pyrogram.client.types.pyrogram_type import PyrogramType
|
from pyrogram.client.types.object import Object
|
||||||
|
|
||||||
|
|
||||||
class InlineQueryResultVideo(PyrogramType):
|
class InlineQueryResultVideo(Object):
|
||||||
"""Represents a link to a page containing an embedded video player or a video file. By default, this video file will be sent by the user with an optional caption. Alternatively, you can use input_message_content to send a message with the specified content instead of the video.
|
"""Represents a link to a page containing an embedded video player or a video file. By default, this video file will be sent by the user with an optional caption. Alternatively, you can use input_message_content to send a message with the specified content instead of the video.
|
||||||
|
|
||||||
Attributes:
|
Attributes:
|
||||||
|
@@ -16,10 +16,10 @@
|
|||||||
# You should have received a copy of the GNU Lesser General Public License
|
# You should have received a copy of the GNU Lesser General Public License
|
||||||
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
from pyrogram.client.types.pyrogram_type import PyrogramType
|
from pyrogram.client.types.object import Object
|
||||||
|
|
||||||
|
|
||||||
class InlineQueryResultVoice(PyrogramType):
|
class InlineQueryResultVoice(Object):
|
||||||
"""Represents a link to a voice recording in an .ogg container encoded with OPUS. By default, this voice recording will be sent by the user. Alternatively, you can use input_message_content to send a message with the specified content instead of the the voice message.
|
"""Represents a link to a voice recording in an .ogg container encoded with OPUS. By default, this voice recording will be sent by the user. Alternatively, you can use input_message_content to send a message with the specified content instead of the the voice message.
|
||||||
|
|
||||||
Attributes:
|
Attributes:
|
||||||
|
@@ -16,10 +16,10 @@
|
|||||||
# You should have received a copy of the GNU Lesser General Public License
|
# You should have received a copy of the GNU Lesser General Public License
|
||||||
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
from ..pyrogram_type import PyrogramType
|
from ..object import Object
|
||||||
|
|
||||||
|
|
||||||
class InputMedia(PyrogramType):
|
class InputMedia(Object):
|
||||||
"""Content of a media message to be sent.
|
"""Content of a media message to be sent.
|
||||||
|
|
||||||
It should be one of:
|
It should be one of:
|
||||||
|
@@ -18,10 +18,10 @@
|
|||||||
|
|
||||||
from pyrogram.api.types import InputPhoneContact as RawInputPhoneContact
|
from pyrogram.api.types import InputPhoneContact as RawInputPhoneContact
|
||||||
from pyrogram.session.internals import MsgId
|
from pyrogram.session.internals import MsgId
|
||||||
from ..pyrogram_type import PyrogramType
|
from ..object import Object
|
||||||
|
|
||||||
|
|
||||||
class InputPhoneContact(PyrogramType):
|
class InputPhoneContact(Object):
|
||||||
"""A Phone Contact to be added in your Telegram address book.
|
"""A Phone Contact to be added in your Telegram address book.
|
||||||
It is intended to be used with :meth:`~Client.add_contacts() <pyrogram.Client.add_contacts>`
|
It is intended to be used with :meth:`~Client.add_contacts() <pyrogram.Client.add_contacts>`
|
||||||
|
|
||||||
|
@@ -16,14 +16,14 @@
|
|||||||
# You should have received a copy of the GNU Lesser General Public License
|
# You should have received a copy of the GNU Lesser General Public License
|
||||||
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
from ..pyrogram_type import PyrogramType
|
from ..object import Object
|
||||||
|
|
||||||
"""- :obj:`InputLocationMessageContent`
|
"""- :obj:`InputLocationMessageContent`
|
||||||
- :obj:`InputVenueMessageContent`
|
- :obj:`InputVenueMessageContent`
|
||||||
- :obj:`InputContactMessageContent`"""
|
- :obj:`InputContactMessageContent`"""
|
||||||
|
|
||||||
|
|
||||||
class InputMessageContent(PyrogramType):
|
class InputMessageContent(Object):
|
||||||
"""Content of a message to be sent as a result of an inline query.
|
"""Content of a message to be sent as a result of an inline query.
|
||||||
|
|
||||||
Pyrogram currently supports the following 4 types:
|
Pyrogram currently supports the following 4 types:
|
||||||
|
@@ -16,10 +16,10 @@
|
|||||||
# You should have received a copy of the GNU Lesser General Public License
|
# You should have received a copy of the GNU Lesser General Public License
|
||||||
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
from ..pyrogram_type import PyrogramType
|
from ..object import Object
|
||||||
|
|
||||||
|
|
||||||
class CallbackGame(PyrogramType):
|
class CallbackGame(Object):
|
||||||
"""Placeholder, currently holds no information.
|
"""Placeholder, currently holds no information.
|
||||||
|
|
||||||
Use BotFather to set up your game.
|
Use BotFather to set up your game.
|
||||||
|
@@ -22,12 +22,12 @@ from typing import Union
|
|||||||
|
|
||||||
import pyrogram
|
import pyrogram
|
||||||
from pyrogram.api import types
|
from pyrogram.api import types
|
||||||
from ..pyrogram_type import PyrogramType
|
from ..object import Object
|
||||||
from ..update import Update
|
from ..update import Update
|
||||||
from ..user_and_chats import User
|
from ..user_and_chats import User
|
||||||
|
|
||||||
|
|
||||||
class CallbackQuery(PyrogramType, Update):
|
class CallbackQuery(Object, Update):
|
||||||
"""An incoming callback query from a callback button in an inline keyboard.
|
"""An incoming callback query from a callback button in an inline keyboard.
|
||||||
|
|
||||||
If the button that originated the query was attached to a message sent by the bot, the field *message*
|
If the button that originated the query was attached to a message sent by the bot, the field *message*
|
||||||
|
@@ -17,10 +17,10 @@
|
|||||||
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
from pyrogram.api.types import ReplyKeyboardForceReply
|
from pyrogram.api.types import ReplyKeyboardForceReply
|
||||||
from ..pyrogram_type import PyrogramType
|
from ..object import Object
|
||||||
|
|
||||||
|
|
||||||
class ForceReply(PyrogramType):
|
class ForceReply(Object):
|
||||||
"""Object used to force clients to show a reply interface.
|
"""Object used to force clients to show a reply interface.
|
||||||
|
|
||||||
Upon receiving a message with this object, Telegram clients will display a reply interface to the user.
|
Upon receiving a message with this object, Telegram clients will display a reply interface to the user.
|
||||||
|
@@ -19,11 +19,11 @@
|
|||||||
import pyrogram
|
import pyrogram
|
||||||
|
|
||||||
from pyrogram.api import types
|
from pyrogram.api import types
|
||||||
from pyrogram.client.types.pyrogram_type import PyrogramType
|
from pyrogram.client.types.object import Object
|
||||||
from pyrogram.client.types.user_and_chats import User
|
from pyrogram.client.types.user_and_chats import User
|
||||||
|
|
||||||
|
|
||||||
class GameHighScore(PyrogramType):
|
class GameHighScore(Object):
|
||||||
"""One row of the high scores table for a game.
|
"""One row of the high scores table for a game.
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
|
@@ -20,11 +20,11 @@ from typing import List
|
|||||||
|
|
||||||
import pyrogram
|
import pyrogram
|
||||||
from pyrogram.api import types
|
from pyrogram.api import types
|
||||||
from pyrogram.client.types.pyrogram_type import PyrogramType
|
from pyrogram.client.types.object import Object
|
||||||
from .game_high_score import GameHighScore
|
from .game_high_score import GameHighScore
|
||||||
|
|
||||||
|
|
||||||
class GameHighScores(PyrogramType):
|
class GameHighScores(Object):
|
||||||
"""The high scores table for a game.
|
"""The high scores table for a game.
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
|
@@ -24,10 +24,10 @@ from pyrogram.api.types import (
|
|||||||
KeyboardButtonSwitchInline, KeyboardButtonGame
|
KeyboardButtonSwitchInline, KeyboardButtonGame
|
||||||
)
|
)
|
||||||
from .callback_game import CallbackGame
|
from .callback_game import CallbackGame
|
||||||
from ..pyrogram_type import PyrogramType
|
from ..object import Object
|
||||||
|
|
||||||
|
|
||||||
class InlineKeyboardButton(PyrogramType):
|
class InlineKeyboardButton(Object):
|
||||||
"""One button of an inline keyboard.
|
"""One button of an inline keyboard.
|
||||||
|
|
||||||
You must use exactly one of the optional fields.
|
You must use exactly one of the optional fields.
|
||||||
|
@@ -20,10 +20,10 @@ from typing import List
|
|||||||
|
|
||||||
from pyrogram.api.types import ReplyInlineMarkup, KeyboardButtonRow
|
from pyrogram.api.types import ReplyInlineMarkup, KeyboardButtonRow
|
||||||
from . import InlineKeyboardButton
|
from . import InlineKeyboardButton
|
||||||
from ..pyrogram_type import PyrogramType
|
from ..object import Object
|
||||||
|
|
||||||
|
|
||||||
class InlineKeyboardMarkup(PyrogramType):
|
class InlineKeyboardMarkup(Object):
|
||||||
"""An inline keyboard that appears right next to the message it belongs to.
|
"""An inline keyboard that appears right next to the message it belongs to.
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
|
@@ -18,10 +18,10 @@
|
|||||||
|
|
||||||
from pyrogram.api.types import KeyboardButton as RawKeyboardButton
|
from pyrogram.api.types import KeyboardButton as RawKeyboardButton
|
||||||
from pyrogram.api.types import KeyboardButtonRequestPhone, KeyboardButtonRequestGeoLocation
|
from pyrogram.api.types import KeyboardButtonRequestPhone, KeyboardButtonRequestGeoLocation
|
||||||
from ..pyrogram_type import PyrogramType
|
from ..object import Object
|
||||||
|
|
||||||
|
|
||||||
class KeyboardButton(PyrogramType):
|
class KeyboardButton(Object):
|
||||||
"""One button of the reply keyboard.
|
"""One button of the reply keyboard.
|
||||||
For simple text buttons String can be used instead of this object to specify text of the button.
|
For simple text buttons String can be used instead of this object to specify text of the button.
|
||||||
Optional fields are mutually exclusive.
|
Optional fields are mutually exclusive.
|
||||||
|
@@ -21,10 +21,10 @@ from typing import List, Union
|
|||||||
from pyrogram.api.types import KeyboardButtonRow
|
from pyrogram.api.types import KeyboardButtonRow
|
||||||
from pyrogram.api.types import ReplyKeyboardMarkup as RawReplyKeyboardMarkup
|
from pyrogram.api.types import ReplyKeyboardMarkup as RawReplyKeyboardMarkup
|
||||||
from . import KeyboardButton
|
from . import KeyboardButton
|
||||||
from ..pyrogram_type import PyrogramType
|
from ..object import Object
|
||||||
|
|
||||||
|
|
||||||
class ReplyKeyboardMarkup(PyrogramType):
|
class ReplyKeyboardMarkup(Object):
|
||||||
"""A custom keyboard with reply options.
|
"""A custom keyboard with reply options.
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
|
@@ -17,10 +17,10 @@
|
|||||||
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
from pyrogram.api.types import ReplyKeyboardHide
|
from pyrogram.api.types import ReplyKeyboardHide
|
||||||
from ..pyrogram_type import PyrogramType
|
from ..object import Object
|
||||||
|
|
||||||
|
|
||||||
class ReplyKeyboardRemove(PyrogramType):
|
class ReplyKeyboardRemove(Object):
|
||||||
"""Object used to tell clients to remove a bot keyboard.
|
"""Object used to tell clients to remove a bot keyboard.
|
||||||
|
|
||||||
Upon receiving a message with this object, Telegram clients will remove the current custom keyboard and display
|
Upon receiving a message with this object, Telegram clients will remove the current custom keyboard and display
|
||||||
|
@@ -16,17 +16,17 @@
|
|||||||
# You should have received a copy of the GNU Lesser General Public License
|
# You should have received a copy of the GNU Lesser General Public License
|
||||||
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
from .pyrogram_type import PyrogramType
|
from .object import Object
|
||||||
|
|
||||||
|
|
||||||
class PyrogramList(list):
|
class List(list):
|
||||||
__slots__ = []
|
__slots__ = []
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
# noinspection PyCallByClass
|
# noinspection PyCallByClass
|
||||||
return PyrogramType.__str__(self)
|
return Object.__str__(self)
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return "pyrogram.client.types.pyrogram_list.PyrogramList([{}])".format(
|
return "pyrogram.client.types.pyrogram_list.PyrogramList([{}])".format(
|
||||||
",".join(PyrogramType.__repr__(i) for i in self)
|
",".join(Object.__repr__(i) for i in self)
|
||||||
)
|
)
|
@@ -22,11 +22,11 @@ from typing import List
|
|||||||
import pyrogram
|
import pyrogram
|
||||||
from pyrogram.api import types
|
from pyrogram.api import types
|
||||||
from .thumbnail import Thumbnail
|
from .thumbnail import Thumbnail
|
||||||
from ..pyrogram_type import PyrogramType
|
from ..object import Object
|
||||||
from ...ext.utils import encode
|
from ...ext.utils import encode
|
||||||
|
|
||||||
|
|
||||||
class Animation(PyrogramType):
|
class Animation(Object):
|
||||||
"""An animation file (GIF or H.264/MPEG-4 AVC video without sound).
|
"""An animation file (GIF or H.264/MPEG-4 AVC video without sound).
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
|
@@ -22,11 +22,11 @@ from typing import List
|
|||||||
import pyrogram
|
import pyrogram
|
||||||
from pyrogram.api import types
|
from pyrogram.api import types
|
||||||
from .thumbnail import Thumbnail
|
from .thumbnail import Thumbnail
|
||||||
from ..pyrogram_type import PyrogramType
|
from ..object import Object
|
||||||
from ...ext.utils import encode
|
from ...ext.utils import encode
|
||||||
|
|
||||||
|
|
||||||
class Audio(PyrogramType):
|
class Audio(Object):
|
||||||
"""An audio file to be treated as music by the Telegram clients.
|
"""An audio file to be treated as music by the Telegram clients.
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
|
@@ -19,10 +19,10 @@
|
|||||||
import pyrogram
|
import pyrogram
|
||||||
|
|
||||||
from pyrogram.api import types
|
from pyrogram.api import types
|
||||||
from ..pyrogram_type import PyrogramType
|
from ..object import Object
|
||||||
|
|
||||||
|
|
||||||
class Contact(PyrogramType):
|
class Contact(Object):
|
||||||
"""A phone contact.
|
"""A phone contact.
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
|
@@ -22,11 +22,11 @@ from typing import List
|
|||||||
import pyrogram
|
import pyrogram
|
||||||
from pyrogram.api import types
|
from pyrogram.api import types
|
||||||
from .thumbnail import Thumbnail
|
from .thumbnail import Thumbnail
|
||||||
from ..pyrogram_type import PyrogramType
|
from ..object import Object
|
||||||
from ...ext.utils import encode
|
from ...ext.utils import encode
|
||||||
|
|
||||||
|
|
||||||
class Document(PyrogramType):
|
class Document(Object):
|
||||||
"""A generic file (as opposed to photos, voice messages, audio files, ...).
|
"""A generic file (as opposed to photos, voice messages, audio files, ...).
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
|
@@ -20,10 +20,10 @@ import pyrogram
|
|||||||
from pyrogram.api import types
|
from pyrogram.api import types
|
||||||
from .animation import Animation
|
from .animation import Animation
|
||||||
from .photo import Photo
|
from .photo import Photo
|
||||||
from ..pyrogram_type import PyrogramType
|
from ..object import Object
|
||||||
|
|
||||||
|
|
||||||
class Game(PyrogramType):
|
class Game(Object):
|
||||||
"""A game.
|
"""A game.
|
||||||
Use BotFather to create and edit games, their short names will act as unique identifiers.
|
Use BotFather to create and edit games, their short names will act as unique identifiers.
|
||||||
|
|
||||||
|
@@ -19,10 +19,10 @@
|
|||||||
import pyrogram
|
import pyrogram
|
||||||
|
|
||||||
from pyrogram.api import types
|
from pyrogram.api import types
|
||||||
from ..pyrogram_type import PyrogramType
|
from ..object import Object
|
||||||
|
|
||||||
|
|
||||||
class Location(PyrogramType):
|
class Location(Object):
|
||||||
"""A point on the map.
|
"""A point on the map.
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
|
@@ -27,7 +27,7 @@ from .contact import Contact
|
|||||||
from .location import Location
|
from .location import Location
|
||||||
from .message_entity import MessageEntity
|
from .message_entity import MessageEntity
|
||||||
from ..messages_and_media.photo import Photo
|
from ..messages_and_media.photo import Photo
|
||||||
from ..pyrogram_type import PyrogramType
|
from ..object import Object
|
||||||
from ..update import Update
|
from ..update import Update
|
||||||
from ..user_and_chats.chat import Chat
|
from ..user_and_chats.chat import Chat
|
||||||
from ..user_and_chats.user import User
|
from ..user_and_chats.user import User
|
||||||
@@ -59,7 +59,7 @@ class Str(str):
|
|||||||
return self._client.html.unparse(self, self._entities)
|
return self._client.html.unparse(self, self._entities)
|
||||||
|
|
||||||
|
|
||||||
class Message(PyrogramType, Update):
|
class Message(Object, Update):
|
||||||
"""A message.
|
"""A message.
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
|
@@ -19,11 +19,11 @@
|
|||||||
import pyrogram
|
import pyrogram
|
||||||
|
|
||||||
from pyrogram.api import types
|
from pyrogram.api import types
|
||||||
from ..pyrogram_type import PyrogramType
|
from ..object import Object
|
||||||
from ..user_and_chats.user import User
|
from ..user_and_chats.user import User
|
||||||
|
|
||||||
|
|
||||||
class MessageEntity(PyrogramType):
|
class MessageEntity(Object):
|
||||||
"""One special entity in a text message.
|
"""One special entity in a text message.
|
||||||
For example, hashtags, usernames, URLs, etc.
|
For example, hashtags, usernames, URLs, etc.
|
||||||
|
|
||||||
|
@@ -21,12 +21,12 @@ from typing import List, Union
|
|||||||
import pyrogram
|
import pyrogram
|
||||||
from pyrogram.api import types
|
from pyrogram.api import types
|
||||||
from .message import Message
|
from .message import Message
|
||||||
from ..pyrogram_type import PyrogramType
|
from ..object import Object
|
||||||
from ..update import Update
|
from ..update import Update
|
||||||
from ..user_and_chats import Chat
|
from ..user_and_chats import Chat
|
||||||
|
|
||||||
|
|
||||||
class Messages(PyrogramType, Update):
|
class Messages(Object, Update):
|
||||||
"""Contains a chat's messages.
|
"""Contains a chat's messages.
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
|
@@ -22,11 +22,11 @@ from typing import List
|
|||||||
import pyrogram
|
import pyrogram
|
||||||
from pyrogram.api import types
|
from pyrogram.api import types
|
||||||
from .thumbnail import Thumbnail
|
from .thumbnail import Thumbnail
|
||||||
from ..pyrogram_type import PyrogramType
|
from ..object import Object
|
||||||
from ...ext.utils import encode
|
from ...ext.utils import encode
|
||||||
|
|
||||||
|
|
||||||
class Photo(PyrogramType):
|
class Photo(Object):
|
||||||
"""A Photo.
|
"""A Photo.
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
|
@@ -20,10 +20,10 @@ from typing import List
|
|||||||
|
|
||||||
import pyrogram
|
import pyrogram
|
||||||
from .photo import Photo
|
from .photo import Photo
|
||||||
from ..pyrogram_type import PyrogramType
|
from ..object import Object
|
||||||
|
|
||||||
|
|
||||||
class Photos(PyrogramType):
|
class Photos(Object):
|
||||||
"""Contains a user's profile pictures.
|
"""Contains a user's profile pictures.
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
|
@@ -21,11 +21,11 @@ from typing import List, Union
|
|||||||
import pyrogram
|
import pyrogram
|
||||||
from pyrogram.api import types
|
from pyrogram.api import types
|
||||||
from .poll_option import PollOption
|
from .poll_option import PollOption
|
||||||
from ..pyrogram_type import PyrogramType
|
from ..object import Object
|
||||||
from ..update import Update
|
from ..update import Update
|
||||||
|
|
||||||
|
|
||||||
class Poll(PyrogramType, Update):
|
class Poll(Object, Update):
|
||||||
"""A Poll.
|
"""A Poll.
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
|
@@ -17,10 +17,10 @@
|
|||||||
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
import pyrogram
|
import pyrogram
|
||||||
from ..pyrogram_type import PyrogramType
|
from ..object import Object
|
||||||
|
|
||||||
|
|
||||||
class PollOption(PyrogramType):
|
class PollOption(Object):
|
||||||
"""Contains information about one answer option in a poll.
|
"""Contains information about one answer option in a poll.
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
|
@@ -25,11 +25,11 @@ import pyrogram
|
|||||||
from pyrogram.api import types, functions
|
from pyrogram.api import types, functions
|
||||||
from pyrogram.errors import StickersetInvalid
|
from pyrogram.errors import StickersetInvalid
|
||||||
from .thumbnail import Thumbnail
|
from .thumbnail import Thumbnail
|
||||||
from ..pyrogram_type import PyrogramType
|
from ..object import Object
|
||||||
from ...ext.utils import encode
|
from ...ext.utils import encode
|
||||||
|
|
||||||
|
|
||||||
class Sticker(PyrogramType):
|
class Sticker(Object):
|
||||||
"""A sticker.
|
"""A sticker.
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
|
@@ -18,10 +18,10 @@
|
|||||||
|
|
||||||
import pyrogram
|
import pyrogram
|
||||||
from pyrogram.api import types
|
from pyrogram.api import types
|
||||||
from ..pyrogram_type import PyrogramType
|
from ..object import Object
|
||||||
|
|
||||||
|
|
||||||
class StrippedThumbnail(PyrogramType):
|
class StrippedThumbnail(Object):
|
||||||
"""A stripped thumbnail
|
"""A stripped thumbnail
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
|
@@ -23,10 +23,10 @@ import pyrogram
|
|||||||
from pyrogram.api import types
|
from pyrogram.api import types
|
||||||
from pyrogram.client.ext.utils import encode
|
from pyrogram.client.ext.utils import encode
|
||||||
from .stripped_thumbnail import StrippedThumbnail
|
from .stripped_thumbnail import StrippedThumbnail
|
||||||
from ..pyrogram_type import PyrogramType
|
from ..object import Object
|
||||||
|
|
||||||
|
|
||||||
class Thumbnail(PyrogramType):
|
class Thumbnail(Object):
|
||||||
"""One size of a photo or a file/sticker thumbnail.
|
"""One size of a photo or a file/sticker thumbnail.
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
|
@@ -19,10 +19,10 @@
|
|||||||
import pyrogram
|
import pyrogram
|
||||||
from pyrogram.api import types
|
from pyrogram.api import types
|
||||||
from .location import Location
|
from .location import Location
|
||||||
from ..pyrogram_type import PyrogramType
|
from ..object import Object
|
||||||
|
|
||||||
|
|
||||||
class Venue(PyrogramType):
|
class Venue(Object):
|
||||||
"""A venue.
|
"""A venue.
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
|
@@ -22,11 +22,11 @@ from typing import List
|
|||||||
import pyrogram
|
import pyrogram
|
||||||
from pyrogram.api import types
|
from pyrogram.api import types
|
||||||
from .thumbnail import Thumbnail
|
from .thumbnail import Thumbnail
|
||||||
from ..pyrogram_type import PyrogramType
|
from ..object import Object
|
||||||
from ...ext.utils import encode
|
from ...ext.utils import encode
|
||||||
|
|
||||||
|
|
||||||
class Video(PyrogramType):
|
class Video(Object):
|
||||||
"""A video file.
|
"""A video file.
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
|
@@ -22,11 +22,11 @@ from typing import List
|
|||||||
import pyrogram
|
import pyrogram
|
||||||
from pyrogram.api import types
|
from pyrogram.api import types
|
||||||
from .thumbnail import Thumbnail
|
from .thumbnail import Thumbnail
|
||||||
from ..pyrogram_type import PyrogramType
|
from ..object import Object
|
||||||
from ...ext.utils import encode
|
from ...ext.utils import encode
|
||||||
|
|
||||||
|
|
||||||
class VideoNote(PyrogramType):
|
class VideoNote(Object):
|
||||||
"""A video note.
|
"""A video note.
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
|
@@ -20,11 +20,11 @@ from struct import pack
|
|||||||
|
|
||||||
import pyrogram
|
import pyrogram
|
||||||
from pyrogram.api import types
|
from pyrogram.api import types
|
||||||
from ..pyrogram_type import PyrogramType
|
from ..object import Object
|
||||||
from ...ext.utils import encode
|
from ...ext.utils import encode
|
||||||
|
|
||||||
|
|
||||||
class Voice(PyrogramType):
|
class Voice(Object):
|
||||||
"""A voice note.
|
"""A voice note.
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
|
@@ -23,7 +23,12 @@ from json import dumps
|
|||||||
import pyrogram
|
import pyrogram
|
||||||
|
|
||||||
|
|
||||||
class PyrogramType:
|
class Meta(type, metaclass=type("", (type,), {"__str__": lambda _: "~hi"})):
|
||||||
|
def __str__(self):
|
||||||
|
return "<class 'pyrogram.{}'>".format(self.__name__)
|
||||||
|
|
||||||
|
|
||||||
|
class Object(metaclass=Meta):
|
||||||
__slots__ = ["_client"]
|
__slots__ = ["_client"]
|
||||||
|
|
||||||
def __init__(self, client: "pyrogram.BaseClient" = None):
|
def __init__(self, client: "pyrogram.BaseClient" = None):
|
||||||
@@ -32,35 +37,26 @@ class PyrogramType:
|
|||||||
if self._client is None:
|
if self._client is None:
|
||||||
del self._client
|
del self._client
|
||||||
|
|
||||||
def __eq__(self, other: "PyrogramType") -> bool:
|
@staticmethod
|
||||||
for attr in self.__slots__:
|
def default(obj: "Object"):
|
||||||
try:
|
if isinstance(obj, bytes):
|
||||||
if getattr(self, attr) != getattr(other, attr):
|
return repr(obj)
|
||||||
return False
|
|
||||||
except AttributeError:
|
|
||||||
return False
|
|
||||||
|
|
||||||
return True
|
return OrderedDict(
|
||||||
|
[("_", "pyrogram." + obj.__class__.__name__)]
|
||||||
|
+ [
|
||||||
|
(attr, "*" * len(getattr(obj, attr)))
|
||||||
|
if attr == "phone_number"
|
||||||
|
else (attr, str(datetime.fromtimestamp(getattr(obj, attr))))
|
||||||
|
if attr.endswith("date")
|
||||||
|
else (attr, getattr(obj, attr))
|
||||||
|
for attr in obj.__slots__
|
||||||
|
if getattr(obj, attr) is not None
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
def __str__(self) -> str:
|
def __str__(self) -> str:
|
||||||
def default(obj: PyrogramType):
|
return dumps(self, indent=4, default=Object.default, ensure_ascii=False)
|
||||||
try:
|
|
||||||
return OrderedDict(
|
|
||||||
[("_", "pyrogram." + obj.__class__.__name__)]
|
|
||||||
+ [
|
|
||||||
(attr, "*" * len(getattr(obj, attr)))
|
|
||||||
if attr == "phone_number"
|
|
||||||
else (attr, str(datetime.fromtimestamp(getattr(obj, attr))))
|
|
||||||
if attr.endswith("date")
|
|
||||||
else (attr, getattr(obj, attr))
|
|
||||||
for attr in obj.__slots__
|
|
||||||
if getattr(obj, attr) is not None
|
|
||||||
]
|
|
||||||
)
|
|
||||||
except AttributeError:
|
|
||||||
return repr(obj)
|
|
||||||
|
|
||||||
return dumps(self, indent=4, default=default, ensure_ascii=False)
|
|
||||||
|
|
||||||
def __repr__(self) -> str:
|
def __repr__(self) -> str:
|
||||||
return "pyrogram.{}({})".format(
|
return "pyrogram.{}({})".format(
|
||||||
@@ -72,5 +68,18 @@ class PyrogramType:
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def __eq__(self, other: "Object") -> bool:
|
||||||
|
for attr in self.__slots__:
|
||||||
|
try:
|
||||||
|
if getattr(self, attr) != getattr(other, attr):
|
||||||
|
return False
|
||||||
|
except AttributeError:
|
||||||
|
return False
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
def __getitem__(self, item):
|
def __getitem__(self, item):
|
||||||
return getattr(self, item)
|
return getattr(self, item)
|
||||||
|
|
||||||
|
def __setitem__(self, key, value):
|
||||||
|
setattr(self, key, value)
|
@@ -22,10 +22,10 @@ import pyrogram
|
|||||||
from pyrogram.api import types
|
from pyrogram.api import types
|
||||||
from .chat_permissions import ChatPermissions
|
from .chat_permissions import ChatPermissions
|
||||||
from .chat_photo import ChatPhoto
|
from .chat_photo import ChatPhoto
|
||||||
from ..pyrogram_type import PyrogramType
|
from ..object import Object
|
||||||
|
|
||||||
|
|
||||||
class Chat(PyrogramType):
|
class Chat(Object):
|
||||||
"""A chat.
|
"""A chat.
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
|
@@ -19,10 +19,10 @@
|
|||||||
import pyrogram
|
import pyrogram
|
||||||
|
|
||||||
from pyrogram.api import types
|
from pyrogram.api import types
|
||||||
from ..pyrogram_type import PyrogramType
|
from ..object import Object
|
||||||
|
|
||||||
|
|
||||||
class ChatMember(PyrogramType):
|
class ChatMember(Object):
|
||||||
"""Contains information about one member of a chat.
|
"""Contains information about one member of a chat.
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
|
@@ -21,10 +21,10 @@ from typing import List
|
|||||||
import pyrogram
|
import pyrogram
|
||||||
from pyrogram.api import types
|
from pyrogram.api import types
|
||||||
from .chat_member import ChatMember
|
from .chat_member import ChatMember
|
||||||
from ..pyrogram_type import PyrogramType
|
from ..object import Object
|
||||||
|
|
||||||
|
|
||||||
class ChatMembers(PyrogramType):
|
class ChatMembers(Object):
|
||||||
"""Contains information about the members list of a chat.
|
"""Contains information about the members list of a chat.
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
|
@@ -19,10 +19,10 @@
|
|||||||
from typing import Union
|
from typing import Union
|
||||||
|
|
||||||
from pyrogram.api import types
|
from pyrogram.api import types
|
||||||
from ..pyrogram_type import PyrogramType
|
from ..object import Object
|
||||||
|
|
||||||
|
|
||||||
class ChatPermissions(PyrogramType):
|
class ChatPermissions(Object):
|
||||||
"""A chat default permissions and a single member permissions within a chat.
|
"""A chat default permissions and a single member permissions within a chat.
|
||||||
|
|
||||||
Some permissions make sense depending on the context: default chat permissions, restricted/kicked member or
|
Some permissions make sense depending on the context: default chat permissions, restricted/kicked member or
|
||||||
|
@@ -20,11 +20,11 @@ from struct import pack
|
|||||||
|
|
||||||
import pyrogram
|
import pyrogram
|
||||||
from pyrogram.api import types
|
from pyrogram.api import types
|
||||||
from ..pyrogram_type import PyrogramType
|
from ..object import Object
|
||||||
from ...ext.utils import encode
|
from ...ext.utils import encode
|
||||||
|
|
||||||
|
|
||||||
class ChatPhoto(PyrogramType):
|
class ChatPhoto(Object):
|
||||||
"""A chat photo.
|
"""A chat photo.
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
|
@@ -21,11 +21,11 @@ from typing import List
|
|||||||
import pyrogram
|
import pyrogram
|
||||||
from pyrogram.api import types
|
from pyrogram.api import types
|
||||||
from .chat_photo import ChatPhoto
|
from .chat_photo import ChatPhoto
|
||||||
from ..pyrogram_type import PyrogramType
|
from ..object import Object
|
||||||
from ..user_and_chats.user import User
|
from ..user_and_chats.user import User
|
||||||
|
|
||||||
|
|
||||||
class ChatPreview(PyrogramType):
|
class ChatPreview(Object):
|
||||||
"""A chat preview.
|
"""A chat preview.
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
|
@@ -19,11 +19,11 @@
|
|||||||
import pyrogram
|
import pyrogram
|
||||||
|
|
||||||
from pyrogram.api import types
|
from pyrogram.api import types
|
||||||
from ..pyrogram_type import PyrogramType
|
from ..object import Object
|
||||||
from ..user_and_chats import Chat
|
from ..user_and_chats import Chat
|
||||||
|
|
||||||
|
|
||||||
class Dialog(PyrogramType):
|
class Dialog(Object):
|
||||||
"""A user's dialog.
|
"""A user's dialog.
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user