Merge branch 'develop' into asyncio

# Conflicts:
#	pyrogram/connection/transport/tcp/tcp.py
This commit is contained in:
Dan 2018-09-22 14:49:35 +02:00
commit 41acdd4d63
5 changed files with 56 additions and 16 deletions

View File

@ -33,7 +33,7 @@ Examples (more on `GitHub <https://github.com/pyrogram/pyrogram/tree/develop/exa
Raw Functions Raw Functions
------------- -------------
If you can't find a high-level method for your needs or if want complete, low-level access to the whole Telegram API, If you can't find a high-level method for your needs or if you want complete, low-level access to the whole Telegram API,
you have to use the raw :mod:`functions <pyrogram.api.functions>` and :mod:`types <pyrogram.api.types>` exposed by the you have to use the raw :mod:`functions <pyrogram.api.functions>` and :mod:`types <pyrogram.api.types>` exposed by the
``pyrogram.api`` package and call any Telegram API method you wish using the :meth:`send() <pyrogram.Client.send>` ``pyrogram.api`` package and call any Telegram API method you wish using the :meth:`send() <pyrogram.Client.send>`
method provided by the Client class. method provided by the Client class.

View File

@ -90,6 +90,10 @@ class Client(Methods, BaseClient):
Code of the language used on the client, in ISO 639-1 standard. Defaults to "en". Code of the language used on the client, in ISO 639-1 standard. Defaults to "en".
This is an alternative way to set it if you don't want to use the *config.ini* file. This is an alternative way to set it if you don't want to use the *config.ini* file.
ipv6 (``bool``, *optional*):
Pass True to connect to Telegram using IPv6.
Defaults to False (IPv4).
proxy (``dict``, *optional*): proxy (``dict``, *optional*):
Your SOCKS5 Proxy settings as dict, Your SOCKS5 Proxy settings as dict,
e.g.: *dict(hostname="11.22.33.44", port=1080, username="user", password="pass")*. e.g.: *dict(hostname="11.22.33.44", port=1080, username="user", password="pass")*.

View File

@ -36,6 +36,28 @@ class EditMessageMedia(BaseClient):
message_id: int, message_id: int,
media, media,
reply_markup=None): reply_markup=None):
"""Use this method to edit audio, document, photo, or video messages.
If a message is a part of a message album, then it can be edited only to a photo or a video. Otherwise,
message type can be changed arbitrarily. When inline message is edited, new file can't be uploaded.
Use previously uploaded file via its file_id or specify a URL. On success, if the edited message was sent
by the bot, the edited Message is returned, otherwise True is returned.
Args:
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).
message_id (``int``):
Message identifier in the chat specified in chat_id.
media (:obj:`InputMediaAnimation` | :obj:`InputMediaAudio` | :obj:`InputMediaDocument` | :obj:`InputMediaPhoto` | :obj:`InputMediaVideo`)
One of the InputMedia objects describing an animation, audio, document, photo or video.
reply_markup (:obj:`InlineKeyboardMarkup`, *optional*):
An InlineKeyboardMarkup object.
"""
style = self.html if media.parse_mode.lower() == "html" else self.markdown style = self.html if media.parse_mode.lower() == "html" else self.markdown
caption = media.caption caption = media.caption

View File

@ -19,6 +19,7 @@
import asyncio import asyncio
import logging import logging
import socket import socket
import ipaddress
try: try:
import socks import socks
@ -37,31 +38,43 @@ class TCP:
TIMEOUT = 10 TIMEOUT = 10
def __init__(self, ipv6: bool, proxy: dict): def __init__(self, ipv6: bool, proxy: dict):
self.proxy = proxy self.socket = None
self.lock = asyncio.Lock()
self.socket = socks.socksocket(family=socket.AF_INET6 if ipv6 else socket.AF_INET)
self.socket.settimeout(TCP.TIMEOUT)
self.reader = None # type: asyncio.StreamReader self.reader = None # type: asyncio.StreamReader
self.writer = None # type: asyncio.StreamWriter self.writer = None # type: asyncio.StreamWriter
self.proxy_enabled = proxy.get("enabled", False)
if proxy and self.proxy_enabled: self.lock = asyncio.Lock()
if proxy.get("enabled", False):
hostname = proxy.get("hostname", None)
port = proxy.get("port", None)
try:
ip_address = ipaddress.ip_address(hostname)
except ValueError:
self.socket = socks.socksocket(socket.AF_INET)
else:
if isinstance(ip_address, ipaddress.IPv6Address):
self.socket = socks.socksocket(socket.AF_INET6)
else:
self.socket = socks.socksocket(socket.AF_INET)
self.socket.set_proxy( self.socket.set_proxy(
proxy_type=socks.SOCKS5, proxy_type=socks.SOCKS5,
addr=proxy.get("hostname", None), addr=hostname,
port=proxy.get("port", None), port=port,
username=proxy.get("username", None), username=proxy.get("username", None),
password=proxy.get("password", None) password=proxy.get("password", None)
) )
log.info("Using proxy {}:{}".format( log.info("Using proxy {}:{}".format(hostname, port))
proxy.get("hostname", None), else:
proxy.get("port", None) super().__init__(
)) socket.AF_INET6 if ipv6
else socket.AF_INET
)
self.socket.settimeout(TCP.TIMEOUT)
async def connect(self, address: tuple): async def connect(self, address: tuple):
self.socket.connect(address) self.socket.connect(address)

View File

@ -130,6 +130,7 @@ class Generate(Command):
if len(argv) > 1 and argv[1] in ["bdist_wheel", "install"]: if len(argv) > 1 and argv[1] in ["bdist_wheel", "install"]:
error_compiler.start() error_compiler.start()
api_compiler.start() api_compiler.start()
docs_compiler.start()
setup( setup(
name="Pyrogram", name="Pyrogram",