Merge develop -> asyncio-dev

This commit is contained in:
Dan 2020-07-17 13:43:10 +02:00
commit aa078f103c
17 changed files with 40 additions and 39 deletions

View File

@ -26,7 +26,7 @@ NOTICE_PATH = "NOTICE"
SECTION_RE = re.compile(r"---(\w+)---") SECTION_RE = re.compile(r"---(\w+)---")
LAYER_RE = re.compile(r"//\sLAYER\s(\d+)") LAYER_RE = re.compile(r"//\sLAYER\s(\d+)")
COMBINATOR_RE = re.compile(r"^([\w.]+)#([0-9a-f]+)\s(?:.*)=\s([\w<>.]+);(?: // Docs: (.+))?$", re.MULTILINE) COMBINATOR_RE = re.compile(r"^([\w.]+)#([0-9a-f]+)\s(?:.*)=\s([\w<>.]+);(?: // Docs: (.+))?$", re.MULTILINE)
ARGS_RE = re.compile("[^{](\w+):([\w?!.<>#]+)") ARGS_RE = re.compile(r"[^{](\w+):([\w?!.<>#]+)")
FLAGS_RE = re.compile(r"flags\.(\d+)\?") FLAGS_RE = re.compile(r"flags\.(\d+)\?")
FLAGS_RE_2 = re.compile(r"flags\.(\d+)\?([\w<>.]+)") FLAGS_RE_2 = re.compile(r"flags\.(\d+)\?([\w<>.]+)")
FLAGS_RE_3 = re.compile(r"flags:#") FLAGS_RE_3 = re.compile(r"flags:#")

View File

@ -2,7 +2,7 @@
- Install requirements. - Install requirements.
- Install `pandoc` and `latexmk`. - Install `pandoc` and `latexmk`.
- HTML: `make html` - HTML: `make html`
- PDF: `make latexpdf` - PDF: `make latexpdf`
TODO: Explain better TODO: Explain better

View File

@ -106,7 +106,7 @@ Welcome to Pyrogram
@app.on_message(Filters.private) @app.on_message(Filters.private)
def hello(client, message): def hello(client, message):
message.reply_text("Hello {}".format(message.from_user.first_name)) message.reply_text(f"Hello {message.from_user.first_name}")
app.run() app.run()

View File

@ -71,5 +71,15 @@ Projects Showcase
----- -----
`Pyrubrum <https://github.com/hearot/pyrubrum>`_
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| **An intuitive framework for creating Telegram bots**
| --- by `Hearot <https://t.me/hearot>`_
- Source Code: https://github.com/hearot/pyrubrum
-----
.. _Feature Request: https://github.com/pyrogram/pyrogram/issues/new?labels=enhancement&template=feature_request.md .. _Feature Request: https://github.com/pyrogram/pyrogram/issues/new?labels=enhancement&template=feature_request.md

View File

@ -26,7 +26,7 @@ import shutil
import tempfile import tempfile
from configparser import ConfigParser from configparser import ConfigParser
from hashlib import sha256, md5 from hashlib import sha256, md5
from importlib import import_module, reload from importlib import import_module
from pathlib import Path from pathlib import Path
from signal import signal, SIGINT, SIGTERM, SIGABRT from signal import signal, SIGINT, SIGTERM, SIGABRT
from typing import Union, List, BinaryIO from typing import Union, List, BinaryIO
@ -1527,7 +1527,7 @@ class Client(Methods, BaseClient):
if not include: if not include:
for path in sorted(Path(root.replace(".", "/")).rglob("*.py")): for path in sorted(Path(root.replace(".", "/")).rglob("*.py")):
module_path = '.'.join(path.parent.parts + (path.stem,)) module_path = '.'.join(path.parent.parts + (path.stem,))
module = reload(import_module(module_path)) module = import_module(module_path)
for name in vars(module).keys(): for name in vars(module).keys():
# noinspection PyBroadException # noinspection PyBroadException
@ -1549,7 +1549,7 @@ class Client(Methods, BaseClient):
warn_non_existent_functions = True warn_non_existent_functions = True
try: try:
module = reload(import_module(module_path)) module = import_module(module_path)
except ImportError: except ImportError:
log.warning('[{}] [LOAD] Ignoring non-existent module "{}"'.format( log.warning('[{}] [LOAD] Ignoring non-existent module "{}"'.format(
self.session_name, module_path)) self.session_name, module_path))
@ -1653,7 +1653,7 @@ class Client(Methods, BaseClient):
try: try:
return self.storage.get_peer_by_id(peer_id) return self.storage.get_peer_by_id(peer_id)
except KeyError: except KeyError:
if type(peer_id) is str: if isinstance(peer_id, str):
if peer_id in ("self", "me"): if peer_id in ("self", "me"):
return types.InputPeerSelf() return types.InputPeerSelf()

View File

@ -214,7 +214,7 @@ class Filters:
from_scheduled = create(lambda _, m: bool(m.from_scheduled), "FromScheduledFilter") from_scheduled = create(lambda _, m: bool(m.from_scheduled), "FromScheduledFilter")
"""Filter new automatically sent messages that were previously scheduled.""" """Filter new automatically sent messages that were previously scheduled."""
# Messages from linked channels are forwarded automatically by Telegram and have no sender (from_user is None). # Messages from linked channels are forwarded automatically by Telegram and have no sender (from_user is None).
linked_channel = create(lambda _, m: bool(m.forward_from_chat and not m.from_user), "LinkedChannelFilter") linked_channel = create(lambda _, m: bool(m.forward_from_chat and not m.from_user), "LinkedChannelFilter")
"""Filter messages that are automatically forwarded from the linked channel to the group chat.""" """Filter messages that are automatically forwarded from the linked channel to the group chat."""
@ -277,11 +277,11 @@ class Filters:
return False return False
commands = commands if type(commands) is list else [commands] commands = commands if isinstance(commands, list) else [commands]
commands = {c if case_sensitive else c.lower() for c in commands} commands = {c if case_sensitive else c.lower() for c in commands}
prefixes = [] if prefixes is None else prefixes prefixes = [] if prefixes is None else prefixes
prefixes = prefixes if type(prefixes) is list else [prefixes] prefixes = prefixes if isinstance(prefixes, list) else [prefixes]
prefixes = set(prefixes) if prefixes else {""} prefixes = set(prefixes) if prefixes else {""}
return create( return create(
@ -345,11 +345,11 @@ class Filters:
""" """
def __init__(self, users: int or str or list = None): def __init__(self, users: int or str or list = None):
users = [] if users is None else users if type(users) is list else [users] users = [] if users is None else users if isinstance(users, list) else [users]
super().__init__( super().__init__(
"me" if u in ["me", "self"] "me" if u in ["me", "self"]
else u.lower().strip("@") if type(u) is str else u.lower().strip("@") if isinstance(u, str)
else u for u in users else u for u in users
) )
@ -376,11 +376,11 @@ class Filters:
""" """
def __init__(self, chats: int or str or list = None): def __init__(self, chats: int or str or list = None):
chats = [] if chats is None else chats if type(chats) is list else [chats] chats = [] if chats is None else chats if isinstance(chats, list) else [chats]
super().__init__( super().__init__(
"me" if c in ["me", "self"] "me" if c in ["me", "self"]
else c.lower().strip("@") if type(c) is str else c.lower().strip("@") if isinstance(c, str)
else c for c in chats else c for c in chats
) )

View File

@ -18,7 +18,7 @@
from typing import Union from typing import Union
from pyrogram.api import functions, types from pyrogram.api import functions
from pyrogram.client.ext import BaseClient from pyrogram.client.ext import BaseClient

View File

@ -41,7 +41,7 @@ class SetChatPhoto(BaseClient):
photo (``str``): photo (``str``):
New chat photo. You can pass a :obj:`Photo` file_id or a file path to upload a new photo from your local New chat photo. You can pass a :obj:`Photo` file_id or a file path to upload a new photo from your local
machine. machine.
file_ref (``str``, *optional*): file_ref (``str``, *optional*):
A valid file reference obtained by a recently fetched media message. A valid file reference obtained by a recently fetched media message.
To be used in combination with a file id in case a file reference is needed. To be used in combination with a file id in case a file reference is needed.

View File

@ -29,7 +29,7 @@ class UpdateChatUsername(BaseClient):
username: Union[str, None] username: Union[str, None]
) -> bool: ) -> bool:
"""Update a channel or a supergroup username. """Update a channel or a supergroup username.
To update your own username (for users only, not bots) you can use :meth:`~Client.update_username`. To update your own username (for users only, not bots) you can use :meth:`~Client.update_username`.
Parameters: Parameters:

View File

@ -23,7 +23,6 @@ from typing import Union, List
import pyrogram import pyrogram
from pyrogram.api import functions from pyrogram.api import functions
from pyrogram.client.ext import utils from pyrogram.client.ext import utils
from pyrogram.errors import FloodWait
from ...ext import BaseClient from ...ext import BaseClient
log = logging.getLogger(__name__) log = logging.getLogger(__name__)

View File

@ -22,7 +22,6 @@ from typing import Union, Iterable, List
import pyrogram import pyrogram
from pyrogram.api import functions, types from pyrogram.api import functions, types
from pyrogram.errors import FloodWait
from ...ext import BaseClient, utils from ...ext import BaseClient, utils
log = logging.getLogger(__name__) log = logging.getLogger(__name__)

View File

@ -35,7 +35,7 @@ class GetCommonChats(BaseClient):
Returns: Returns:
List of :obj:`Chat`: On success, a list of the common chats is returned. List of :obj:`Chat`: On success, a list of the common chats is returned.
Raises: Raises:
ValueError: If the user_id doesn't belong to a user. ValueError: If the user_id doesn't belong to a user.
@ -58,5 +58,5 @@ class GetCommonChats(BaseClient):
) )
return pyrogram.List([pyrogram.Chat._parse_chat(self, x) for x in r.chats]) return pyrogram.List([pyrogram.Chat._parse_chat(self, x) for x in r.chats])
raise ValueError('The user_id "{}" doesn\'t belong to a user'.format(user_id)) raise ValueError('The user_id "{}" doesn\'t belong to a user'.format(user_id))

View File

@ -28,13 +28,13 @@ class UpdateProfile(BaseClient):
bio: str = None bio: str = None
) -> bool: ) -> bool:
"""Update your profile details such as first name, last name and bio. """Update your profile details such as first name, last name and bio.
You can omit the parameters you don't want to change. You can omit the parameters you don't want to change.
Parameters: Parameters:
first_name (``str``, *optional*): first_name (``str``, *optional*):
The new first name. The new first name.
last_name (``str``, *optional*): last_name (``str``, *optional*):
The new last name. The new last name.
Pass "" (empty string) to remove it. Pass "" (empty string) to remove it.
@ -42,19 +42,19 @@ class UpdateProfile(BaseClient):
bio (``str``, *optional*): bio (``str``, *optional*):
The new bio, also known as "about". Max 70 characters. The new bio, also known as "about". Max 70 characters.
Pass "" (empty string) to remove it. Pass "" (empty string) to remove it.
Returns: Returns:
``bool``: True on success. ``bool``: True on success.
Example: Example:
.. code-block:: python .. code-block:: python
# Update your first name only # Update your first name only
app.update_profile(first_name="Pyrogram") app.update_profile(first_name="Pyrogram")
# Update first name and bio # Update first name and bio
app.update_profile(first_name="Pyrogram", bio="https://docs.pyrogram.org/") app.update_profile(first_name="Pyrogram", bio="https://docs.pyrogram.org/")
# Remove the last name # Remove the last name
app.update_profile(last_name="") app.update_profile(last_name="")
""" """

View File

@ -28,7 +28,7 @@ class UpdateUsername(BaseClient):
username: Union[str, None] username: Union[str, None]
) -> bool: ) -> bool:
"""Update your own username. """Update your own username.
This method only works for users, not bots. Bot usernames must be changed via Bot Support or by recreating This method only works for users, not bots. Bot usernames must be changed via Bot Support or by recreating
them from scratch using BotFather. To update a channel or supergroup username you can use them from scratch using BotFather. To update a channel or supergroup username you can use
:meth:`~Client.update_chat_username`. :meth:`~Client.update_chat_username`.

View File

@ -33,7 +33,6 @@
from base64 import b64encode from base64 import b64encode
from struct import pack from struct import pack
from typing import Union
import pyrogram import pyrogram
from pyrogram.api import types from pyrogram.api import types
@ -41,7 +40,6 @@ from pyrogram.client.types.object import Object
from pyrogram.client.types.update import Update from pyrogram.client.types.update import Update
from pyrogram.client.types.user_and_chats import User from pyrogram.client.types.user_and_chats import User
from pyrogram.client.types.messages_and_media import Location from pyrogram.client.types.messages_and_media import Location
from pyrogram.client.ext import utils
class ChosenInlineResult(Object, Update): class ChosenInlineResult(Object, Update):

View File

@ -16,14 +16,9 @@
# 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 struct import pack
from typing import List
import pyrogram import pyrogram
from pyrogram.api import types from pyrogram.api import types
from .thumbnail import Thumbnail
from ..object import Object from ..object import Object
from ...ext.utils import encode_file_id, encode_file_ref
class Dice(Object): class Dice(Object):

View File

@ -23,7 +23,7 @@ from pyrogram.api.core import Message, MsgContainer, TLObject
from .msg_id import MsgId from .msg_id import MsgId
from .seq_no import SeqNo from .seq_no import SeqNo
not_content_related = [Ping, HttpWait, MsgsAck, MsgContainer] not_content_related = (Ping, HttpWait, MsgsAck, MsgContainer)
class MsgFactory: class MsgFactory:
@ -34,6 +34,6 @@ class MsgFactory:
return Message( return Message(
body, body,
MsgId(), MsgId(),
self.seq_no(type(body) not in not_content_related), self.seq_no(not isinstance(body, not_content_related)),
len(body) len(body)
) )