Fix DC migration and seqno

This commit is contained in:
Lonami Exo 2018-10-01 14:02:23 +02:00
parent ac567ebf1d
commit 21ffa2f26b
3 changed files with 12 additions and 7 deletions

View File

@ -369,7 +369,7 @@ class TelegramBaseClient(abc.ABC):
self.session.set_dc(dc.id, dc.ip_address, dc.port) self.session.set_dc(dc.id, dc.ip_address, dc.port)
# auth_key's are associated with a server, which has now changed # auth_key's are associated with a server, which has now changed
# so it's not valid anymore. Set to None to force recreating it. # so it's not valid anymore. Set to None to force recreating it.
self.session.auth_key = self._sender.state.auth_key = None self.session.auth_key = self._sender._connection._state.auth_key = None
self.session.save() self.session.save()
await self._disconnect() await self._disconnect()
return await self.connect() return await self.connect()

View File

@ -2,6 +2,7 @@ import io
import struct import struct
from .mtprotostate import MTProtoState from .mtprotostate import MTProtoState
from ..tl import TLRequest
from ..tl.core.messagecontainer import MessageContainer from ..tl.core.messagecontainer import MessageContainer
@ -78,14 +79,15 @@ class MTProtoLayer:
for state in state_list: for state in state_list:
if not isinstance(state, list): if not isinstance(state, list):
n += 1 n += 1
state.msg_id = \ state.msg_id = self._state.write_data_as_message(
self._state.write_data_as_message(buffer, state.data) buffer, state.data, isinstance(state.request, TLRequest))
else: else:
last_id = None last_id = None
for s in state: for s in state:
n += 1 n += 1
last_id = s.msg_id = self._state.write_data_as_message( last_id = s.msg_id = self._state.write_data_as_message(
buffer, s.data, after_id=last_id) buffer, s.data, isinstance(s.request, TLRequest),
after_id=last_id)
if n > 1: if n > 1:
# Inlined code to pack several messages into a container # Inlined code to pack several messages into a container
@ -97,7 +99,9 @@ class MTProtoLayer:
'<Ii', MessageContainer.CONSTRUCTOR_ID, n '<Ii', MessageContainer.CONSTRUCTOR_ID, n
) + buffer.getvalue() ) + buffer.getvalue()
buffer = io.BytesIO() buffer = io.BytesIO()
container_id = self._state.write_data_as_message(buffer, data) container_id = self._state.write_data_as_message(
buffer, data, content_related=False
)
for state in state_list: for state in state_list:
if not isinstance(state, list): if not isinstance(state, list):
state.container_id = container_id state.container_id = container_id

View File

@ -69,14 +69,15 @@ class MTProtoState:
return aes_key, aes_iv return aes_key, aes_iv
def write_data_as_message(self, buffer, data, after_id=None): def write_data_as_message(self, buffer, data, content_related,
*, after_id=None):
""" """
Writes a message containing the given data into buffer. Writes a message containing the given data into buffer.
Returns the message id. Returns the message id.
""" """
msg_id = self._get_new_msg_id() msg_id = self._get_new_msg_id()
seq_no = self._get_seq_no(True) # TODO ack/ping are not content-related seq_no = self._get_seq_no(content_related)
if after_id is None: if after_id is None:
body = GzipPacked.gzip_if_smaller(data) body = GzipPacked.gzip_if_smaller(data)
else: else: