diff --git a/telethon/network/mtprotostate.py b/telethon/network/mtprotostate.py index 05090260..0fe9cc08 100644 --- a/telethon/network/mtprotostate.py +++ b/telethon/network/mtprotostate.py @@ -7,10 +7,23 @@ from ..crypto import AES from ..errors import SecurityError, InvalidBufferError from ..extensions import BinaryReader from ..tl.core import TLMessage +from ..tl.tlobject import TLRequest from ..tl.functions import InvokeAfterMsgRequest from ..tl.core.gzippacked import GzipPacked +class _OpaqueRequest(TLRequest): + """ + Wraps a serialized request into a type that can be serialized again. + """ + def __init__(self, data: bytes): + self.data = data + + def _bytes(self): + return self.data + + + class MTProtoState: """ `telethon.network.mtprotosender.MTProtoSender` needs to hold a state @@ -87,8 +100,10 @@ class MTProtoState: if after_id is None: body = GzipPacked.gzip_if_smaller(content_related, data) else: + # The `RequestState` stores `bytes(request)`, not the request itself. + # `invokeAfterMsg` wants a `TLRequest` though, hence the wrapping. body = GzipPacked.gzip_if_smaller(content_related, - bytes(InvokeAfterMsgRequest(after_id, data))) + bytes(InvokeAfterMsgRequest(after_id, _OpaqueRequest(data)))) buffer.write(struct.pack('