mirror of
				https://github.com/LonamiWebs/Telethon.git
				synced 2025-10-31 16:07:44 +03:00 
			
		
		
		
	Allow sending ordered MessageContainer
This commit is contained in:
		
							parent
							
								
									bda7eb0ef1
								
							
						
					
					
						commit
						e200acbca8
					
				|  | @ -2,7 +2,6 @@ | |||
| This module contains the class used to communicate with Telegram's servers | ||||
| encrypting every packet, and relies on a valid AuthKey in the used Session. | ||||
| """ | ||||
| import gzip | ||||
| import logging | ||||
| from threading import Lock | ||||
| 
 | ||||
|  | @ -14,6 +13,7 @@ from ..errors import ( | |||
| from ..extensions import BinaryReader | ||||
| from ..tl import TLMessage, MessageContainer, GzipPacked | ||||
| from ..tl.all_tlobjects import tlobjects | ||||
| from ..tl.functions import InvokeAfterMsgRequest | ||||
| from ..tl.functions.auth import LogOutRequest | ||||
| from ..tl.types import ( | ||||
|     MsgsAck, Pong, BadServerSalt, BadMsgNotification, FutureSalts, | ||||
|  | @ -84,15 +84,26 @@ class MtProtoSender: | |||
| 
 | ||||
|     # region Send and receive | ||||
| 
 | ||||
|     def send(self, *requests): | ||||
|     def send(self, *requests, ordered=False): | ||||
|         """ | ||||
|         Sends the specified TLObject(s) (which must be requests), | ||||
|         and acknowledging any message which needed confirmation. | ||||
| 
 | ||||
|         :param requests: the requests to be sent. | ||||
|         :param ordered: whether the requests should be invoked in the | ||||
|                         order in which they appear or they can be executed | ||||
|                         in arbitrary order in the server. | ||||
|         """ | ||||
|         # Finally send our packed request(s) | ||||
|         messages = [TLMessage(self.session, r) for r in requests] | ||||
|         if ordered: | ||||
|             requests = iter(requests) | ||||
|             messages = [TLMessage(self.session, next(requests))] | ||||
|             for r in requests: | ||||
|                 messages.append(TLMessage( | ||||
|                     self.session, InvokeAfterMsgRequest(messages[-1].msg_id, r) | ||||
|                 )) | ||||
|         else: | ||||
|             messages = [TLMessage(self.session, r) for r in requests] | ||||
| 
 | ||||
|         self._pending_receive.update({m.msg_id: m for m in messages}) | ||||
| 
 | ||||
|         __log__.debug('Sending requests with IDs: %s', ', '.join( | ||||
|  |  | |||
|  | @ -429,11 +429,15 @@ class TelegramBareClient: | |||
| 
 | ||||
|     # region Invoking Telegram requests | ||||
| 
 | ||||
|     def __call__(self, *requests, retries=5): | ||||
|     def __call__(self, *requests, retries=5, ordered=False): | ||||
|         """Invokes (sends) a MTProtoRequest and returns (receives) its result. | ||||
| 
 | ||||
|            The invoke will be retried up to 'retries' times before raising | ||||
|            RuntimeError(). | ||||
| 
 | ||||
|            If more than one request is given and ordered is True, then the | ||||
|            requests will be invoked sequentially in the server (useful for | ||||
|            bursts of requests that need to be ordered). | ||||
|         """ | ||||
|         if not all(isinstance(x, TLObject) and | ||||
|                    x.content_related for x in requests): | ||||
|  | @ -458,7 +462,7 @@ class TelegramBareClient: | |||
|             not self._idling.is_set() or self._reconnect_lock.locked() | ||||
| 
 | ||||
|         for retry in range(retries): | ||||
|             result = self._invoke(call_receive, *requests) | ||||
|             result = self._invoke(call_receive, *requests, ordered=ordered) | ||||
|             if result is not None: | ||||
|                 return result | ||||
| 
 | ||||
|  | @ -481,7 +485,7 @@ class TelegramBareClient: | |||
|     # Let people use client.invoke(SomeRequest()) instead client(...) | ||||
|     invoke = __call__ | ||||
| 
 | ||||
|     def _invoke(self, call_receive, *requests): | ||||
|     def _invoke(self, call_receive, *requests, ordered=False): | ||||
|         try: | ||||
|             # Ensure that we start with no previous errors (i.e. resending) | ||||
|             for x in requests: | ||||
|  | @ -506,7 +510,7 @@ class TelegramBareClient: | |||
|                         self._wrap_init_connection(GetConfigRequest()) | ||||
|                     ) | ||||
| 
 | ||||
|             self._sender.send(*requests) | ||||
|             self._sender.send(*requests, ordered=ordered) | ||||
| 
 | ||||
|             if not call_receive: | ||||
|                 # TODO This will be slightly troublesome if we allow | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	Block a user