mirror of
https://github.com/LonamiWebs/Telethon.git
synced 2025-06-18 19:16:43 +00:00
Avoid calling InitConnectionRequest when it's not needed
This commit is contained in:
parent
29471f3bba
commit
59a4315c28
@ -125,46 +125,42 @@ class TelegramBareClient:
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
if not self.session.auth_key:
|
if not self.session.auth_key:
|
||||||
|
# New key, we need to tell the server we're going to use
|
||||||
|
# the latest layer
|
||||||
self.session.auth_key, self.session.time_offset = \
|
self.session.auth_key, self.session.time_offset = \
|
||||||
authenticator.do_authentication(connection)
|
authenticator.do_authentication(connection)
|
||||||
|
|
||||||
|
self.session.layer = layer
|
||||||
self.session.save()
|
self.session.save()
|
||||||
|
init_connection = True
|
||||||
|
else:
|
||||||
|
init_connection = self.session.layer != layer
|
||||||
|
|
||||||
self._sender = MtProtoSender(connection, self.session)
|
self._sender = MtProtoSender(connection, self.session)
|
||||||
self._sender.connect()
|
self._sender.connect()
|
||||||
|
|
||||||
# Now it's time to send an InitConnectionRequest
|
if init_connection:
|
||||||
# This must always be invoked with the layer we'll be using
|
|
||||||
if exported_auth is None:
|
|
||||||
query = initial_query if initial_query else GetConfigRequest()
|
|
||||||
else:
|
|
||||||
query = ImportAuthorizationRequest(
|
|
||||||
exported_auth.id, exported_auth.bytes)
|
|
||||||
|
|
||||||
request = InitConnectionRequest(
|
|
||||||
api_id=self.api_id,
|
|
||||||
device_model=self.session.device_model,
|
|
||||||
system_version=self.session.system_version,
|
|
||||||
app_version=self.session.app_version,
|
|
||||||
lang_code=self.session.lang_code,
|
|
||||||
system_lang_code=self.session.system_lang_code,
|
|
||||||
lang_pack='', # "langPacks are for official apps only"
|
|
||||||
query=query)
|
|
||||||
|
|
||||||
result = self(InvokeWithLayerRequest(
|
|
||||||
layer=layer, query=request
|
|
||||||
))
|
|
||||||
|
|
||||||
if initial_query is None:
|
|
||||||
if exported_auth is not None:
|
if exported_auth is not None:
|
||||||
result = self(GetConfigRequest())
|
self._init_connection(ImportAuthorizationRequest(
|
||||||
|
exported_auth.id, exported_auth.bytes
|
||||||
# We're only interested in the DC options,
|
))
|
||||||
# although many other options are available!
|
elif initial_query:
|
||||||
self.dc_options = result.dc_options
|
return self._init_connection(initial_query)
|
||||||
return True
|
else:
|
||||||
|
self.dc_options = \
|
||||||
|
self._init_connection(GetConfigRequest()).dc_options
|
||||||
else:
|
else:
|
||||||
return result
|
# TODO Avoid duplicated code
|
||||||
|
if exported_auth is not None:
|
||||||
|
self(ImportAuthorizationRequest(
|
||||||
|
exported_auth.id, exported_auth.bytes
|
||||||
|
))
|
||||||
|
elif initial_query:
|
||||||
|
return self(initial_query)
|
||||||
|
if not self.dc_options:
|
||||||
|
self.dc_options = self(GetConfigRequest()).dc_options
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
except TypeNotFoundError as e:
|
except TypeNotFoundError as e:
|
||||||
# This is fine, probably layer migration
|
# This is fine, probably layer migration
|
||||||
@ -181,6 +177,21 @@ class TelegramBareClient:
|
|||||||
)
|
)
|
||||||
return None if initial_query else False
|
return None if initial_query else False
|
||||||
|
|
||||||
|
def _init_connection(self, query=None):
|
||||||
|
result = self(InvokeWithLayerRequest(layer, InitConnectionRequest(
|
||||||
|
api_id=self.api_id,
|
||||||
|
device_model=self.session.device_model,
|
||||||
|
system_version=self.session.system_version,
|
||||||
|
app_version=self.session.app_version,
|
||||||
|
lang_code=self.session.lang_code,
|
||||||
|
system_lang_code=self.session.system_lang_code,
|
||||||
|
lang_pack='', # "langPacks are for official apps only"
|
||||||
|
query=query
|
||||||
|
)))
|
||||||
|
self.session.layer = layer
|
||||||
|
self.session.save()
|
||||||
|
return result
|
||||||
|
|
||||||
def disconnect(self):
|
def disconnect(self):
|
||||||
"""Disconnects from the Telegram server"""
|
"""Disconnects from the Telegram server"""
|
||||||
if self._sender:
|
if self._sender:
|
||||||
|
@ -51,15 +51,17 @@ class Session:
|
|||||||
# Cross-thread safety
|
# Cross-thread safety
|
||||||
self._lock = Lock()
|
self._lock = Lock()
|
||||||
|
|
||||||
|
self.id = utils.generate_random_long(signed=False)
|
||||||
|
self._sequence = 0
|
||||||
|
self.time_offset = 0
|
||||||
|
self._last_msg_id = 0 # Long
|
||||||
|
|
||||||
# These values will be saved
|
# These values will be saved
|
||||||
self.server_address = '91.108.56.165'
|
self.server_address = '91.108.56.165'
|
||||||
self.port = 443
|
self.port = 443
|
||||||
self.auth_key = None
|
self.auth_key = None
|
||||||
self.id = utils.generate_random_long(signed=False)
|
self.layer = 0
|
||||||
self._sequence = 0
|
|
||||||
self.salt = 0 # Unsigned long
|
self.salt = 0 # Unsigned long
|
||||||
self.time_offset = 0
|
|
||||||
self._last_msg_id = 0 # Long
|
|
||||||
|
|
||||||
def save(self):
|
def save(self):
|
||||||
"""Saves the current session object as session_user_id.session"""
|
"""Saves the current session object as session_user_id.session"""
|
||||||
@ -68,6 +70,7 @@ class Session:
|
|||||||
json.dump({
|
json.dump({
|
||||||
'port': self.port,
|
'port': self.port,
|
||||||
'salt': self.salt,
|
'salt': self.salt,
|
||||||
|
'layer': self.layer,
|
||||||
'server_address': self.server_address,
|
'server_address': self.server_address,
|
||||||
'auth_key_data':
|
'auth_key_data':
|
||||||
b64encode(self.auth_key.key).decode('ascii')
|
b64encode(self.auth_key.key).decode('ascii')
|
||||||
@ -106,9 +109,11 @@ class Session:
|
|||||||
try:
|
try:
|
||||||
with open(path, 'r') as file:
|
with open(path, 'r') as file:
|
||||||
data = json.load(file)
|
data = json.load(file)
|
||||||
result.port = data['port']
|
result.port = data.get('port', result.port)
|
||||||
result.salt = data['salt']
|
result.salt = data.get('salt', result.salt)
|
||||||
result.server_address = data['server_address']
|
result.layer = data.get('layer', result.layer)
|
||||||
|
result.server_address = \
|
||||||
|
data.get('server_address', result.server_address)
|
||||||
|
|
||||||
# FIXME We need to import the AuthKey here or otherwise
|
# FIXME We need to import the AuthKey here or otherwise
|
||||||
# we get cyclic dependencies.
|
# we get cyclic dependencies.
|
||||||
|
Loading…
Reference in New Issue
Block a user