mirror of
https://github.com/LonamiWebs/Telethon.git
synced 2025-03-12 15:38:03 +03:00
Change the way connection modes are specified
This commit is contained in:
parent
783c1771ab
commit
3d36bb7b93
|
@ -231,6 +231,36 @@ If you still want the old behaviour, wrap the list inside another list:
|
||||||
#+
|
#+
|
||||||
|
|
||||||
|
|
||||||
|
Changes on how to configure a different connection mode
|
||||||
|
-------------------------------------------------------
|
||||||
|
|
||||||
|
The ``connection`` parameter of the ``TelegramClient`` now expects a string, and not a type.
|
||||||
|
The supported values are:
|
||||||
|
|
||||||
|
* ``'full'``
|
||||||
|
* ``'intermediate'``
|
||||||
|
* ``'abridged'``
|
||||||
|
* ``'obfuscated'``
|
||||||
|
* ``'http'``
|
||||||
|
|
||||||
|
The value chosen by the library is left as an implementation detail which may change. However,
|
||||||
|
you can force a certain mode by explicitly configuring it. If you don't want to hardcode the
|
||||||
|
string, you can import these values from the new ``telethon.enums`` module:
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
client = TelegramClient(..., connection='tcp')
|
||||||
|
|
||||||
|
# or
|
||||||
|
|
||||||
|
from telethon.enums import ConnectionMode
|
||||||
|
client = TelegramClient(..., connection=ConnectionMode.TCP)
|
||||||
|
|
||||||
|
You may have noticed there's currently no alternative for ``TcpMTProxy``. This mode has been
|
||||||
|
broken for some time now (see `issue #1319 <https://github.com/LonamiWebs/Telethon/issues/1319>`__)
|
||||||
|
anyway, so until there's a working solution, the mode is not supported. Pull Requests are welcome!
|
||||||
|
|
||||||
|
|
||||||
The Conversation API has been removed
|
The Conversation API has been removed
|
||||||
-------------------------------------
|
-------------------------------------
|
||||||
|
|
||||||
|
|
|
@ -5,13 +5,6 @@ from ._misc import utils # depends on helpers and _tl
|
||||||
from ._misc import hints # depends on types/custom
|
from ._misc import hints # depends on types/custom
|
||||||
|
|
||||||
from ._client.telegramclient import TelegramClient
|
from ._client.telegramclient import TelegramClient
|
||||||
from ._network import connection
|
from . import version, events, utils, errors, enums
|
||||||
from . import version, events, utils, errors
|
|
||||||
|
|
||||||
__version__ = version.__version__
|
__version__ = version.__version__
|
||||||
|
|
||||||
__all__ = [
|
|
||||||
'TelegramClient', 'Button',
|
|
||||||
'types', 'functions', 'custom', 'errors',
|
|
||||||
'events', 'utils', 'connection'
|
|
||||||
]
|
|
||||||
|
|
|
@ -9,8 +9,8 @@ import typing
|
||||||
|
|
||||||
from .. import version, helpers, __name__ as __base_name__, _tl
|
from .. import version, helpers, __name__ as __base_name__, _tl
|
||||||
from .._crypto import rsa
|
from .._crypto import rsa
|
||||||
from .._misc import markdown, entitycache, statecache
|
from .._misc import markdown, entitycache, statecache, enums
|
||||||
from .._network import MTProtoSender, Connection, ConnectionTcpFull, TcpMTProxy
|
from .._network import MTProtoSender, Connection, ConnectionTcpFull, connection as conns
|
||||||
from ..sessions import Session, SQLiteSession, MemorySession
|
from ..sessions import Session, SQLiteSession, MemorySession
|
||||||
|
|
||||||
DEFAULT_DC_ID = 2
|
DEFAULT_DC_ID = 2
|
||||||
|
@ -191,10 +191,19 @@ def init(
|
||||||
self._timeout = timeout
|
self._timeout = timeout
|
||||||
self._auto_reconnect = auto_reconnect
|
self._auto_reconnect = auto_reconnect
|
||||||
|
|
||||||
assert isinstance(connection, type)
|
if connection == ():
|
||||||
self._connection = connection
|
# For now the current default remains TCP Full; may change to be "smart" if proxies are specified
|
||||||
init_proxy = None if not issubclass(connection, TcpMTProxy) else \
|
connection = enums.ConnectionMode.FULL
|
||||||
_tl.InputClientProxy(*connection.address_info(proxy))
|
|
||||||
|
self._connection = {
|
||||||
|
enums.ConnectionMode.FULL: conns.ConnectionTcpFull,
|
||||||
|
enums.ConnectionMode.INTERMEDIATE: conns.ConnectionTcpIntermediate,
|
||||||
|
enums.ConnectionMode.ABRIDGED: conns.ConnectionTcpAbridged,
|
||||||
|
enums.ConnectionMode.OBFUSCATED: conns.ConnectionTcpObfuscated,
|
||||||
|
enums.ConnectionMode.HTTP: conns.ConnectionHttp,
|
||||||
|
}[enums.parse_conn_mode(connection)]
|
||||||
|
init_proxy = None if not issubclass(self._connection, conns.TcpMTProxy) else \
|
||||||
|
_tl.InputClientProxy(*self._connection.address_info(proxy))
|
||||||
|
|
||||||
# Used on connection. Capture the variables in a lambda since
|
# Used on connection. Capture the variables in a lambda since
|
||||||
# exporting clients need to create this InvokeWithLayer.
|
# exporting clients need to create this InvokeWithLayer.
|
||||||
|
@ -334,7 +343,7 @@ async def disconnect(self: 'TelegramClient'):
|
||||||
return await _disconnect_coro(self)
|
return await _disconnect_coro(self)
|
||||||
|
|
||||||
def set_proxy(self: 'TelegramClient', proxy: typing.Union[tuple, dict]):
|
def set_proxy(self: 'TelegramClient', proxy: typing.Union[tuple, dict]):
|
||||||
init_proxy = None if not issubclass(self._connection, TcpMTProxy) else \
|
init_proxy = None if not issubclass(self._connection, conns.TcpMTProxy) else \
|
||||||
_tl.InputClientProxy(*self._connection.address_info(proxy))
|
_tl.InputClientProxy(*self._connection.address_info(proxy))
|
||||||
|
|
||||||
self._init_request.proxy = init_proxy
|
self._init_request.proxy = init_proxy
|
||||||
|
@ -347,7 +356,7 @@ def set_proxy(self: 'TelegramClient', proxy: typing.Union[tuple, dict]):
|
||||||
|
|
||||||
connection = getattr(self._sender, "_connection", None)
|
connection = getattr(self._sender, "_connection", None)
|
||||||
if connection:
|
if connection:
|
||||||
if isinstance(connection, TcpMTProxy):
|
if isinstance(connection, conns.TcpMTProxy):
|
||||||
connection._ip = proxy[0]
|
connection._ip = proxy[0]
|
||||||
connection._port = proxy[1]
|
connection._port = proxy[1]
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -12,6 +12,7 @@ from .. import helpers, version, _tl
|
||||||
from ..types import _custom
|
from ..types import _custom
|
||||||
from .._network import ConnectionTcpFull
|
from .._network import ConnectionTcpFull
|
||||||
from ..events.common import EventBuilder, EventCommon
|
from ..events.common import EventBuilder, EventCommon
|
||||||
|
from .._misc import enums
|
||||||
|
|
||||||
|
|
||||||
class TelegramClient:
|
class TelegramClient:
|
||||||
|
@ -37,9 +38,15 @@ class TelegramClient:
|
||||||
api_hash (`str`):
|
api_hash (`str`):
|
||||||
The API hash you obtained from https://my.telegram.org.
|
The API hash you obtained from https://my.telegram.org.
|
||||||
|
|
||||||
connection (`telethon.network.connection.common.Connection`, optional):
|
connection (`str`, optional):
|
||||||
The connection instance to be used when creating a new connection
|
The connection mode to be used when creating a new connection
|
||||||
to the servers. It **must** be a type.
|
to the servers. The available modes are:
|
||||||
|
|
||||||
|
* ``'full'``
|
||||||
|
* ``'intermediate'``
|
||||||
|
* ``'abridged'``
|
||||||
|
* ``'obfuscated'``
|
||||||
|
* ``'http'``
|
||||||
|
|
||||||
Defaults to `telethon.network.connection.tcpfull.ConnectionTcpFull`.
|
Defaults to `telethon.network.connection.tcpfull.ConnectionTcpFull`.
|
||||||
|
|
||||||
|
@ -2768,7 +2775,7 @@ class TelegramClient:
|
||||||
api_id: int,
|
api_id: int,
|
||||||
api_hash: str,
|
api_hash: str,
|
||||||
*,
|
*,
|
||||||
connection: 'typing.Type[Connection]' = ConnectionTcpFull,
|
connection: typing.Union[str, enums.ConnectionMode] = (),
|
||||||
use_ipv6: bool = False,
|
use_ipv6: bool = False,
|
||||||
proxy: typing.Union[tuple, dict] = None,
|
proxy: typing.Union[tuple, dict] = None,
|
||||||
local_addr: typing.Union[str, tuple] = None,
|
local_addr: typing.Union[str, tuple] = None,
|
||||||
|
|
22
telethon/_misc/enums.py
Normal file
22
telethon/_misc/enums.py
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
from enum import Enum
|
||||||
|
|
||||||
|
|
||||||
|
class ConnectionMode(Enum):
|
||||||
|
FULL = 'full'
|
||||||
|
INTERMEDIATE = 'intermediate'
|
||||||
|
ABRIDGED = 'abridged'
|
||||||
|
OBFUSCATED = 'obfuscated'
|
||||||
|
HTTP = 'http'
|
||||||
|
|
||||||
|
|
||||||
|
def parse_conn_mode(mode):
|
||||||
|
if isinstance(mode, ConnectionMode):
|
||||||
|
return mode
|
||||||
|
elif isinstance(mode, str):
|
||||||
|
for cm in ConnectionMode:
|
||||||
|
if mode == cm.value:
|
||||||
|
return cm
|
||||||
|
|
||||||
|
raise ValueError(f'unknown connection mode: {mode!r}')
|
||||||
|
else:
|
||||||
|
raise TypeError(f'not a valid connection mode: {type(mode).__name__!r}')
|
3
telethon/enums.py
Normal file
3
telethon/enums.py
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
from ._misc.enums import (
|
||||||
|
ConnectionMode,
|
||||||
|
)
|
Loading…
Reference in New Issue
Block a user