mirror of
				https://github.com/LonamiWebs/Telethon.git
				synced 2025-10-24 20:51:05 +03:00 
			
		
		
		
	Remove duplicated docstrings
This commit is contained in:
		
							parent
							
								
									f86339ab17
								
							
						
					
					
						commit
						66ef553adc
					
				|  | @ -195,43 +195,6 @@ async def download_profile_photo( | ||||||
|         file: 'hints.FileLike' = None, |         file: 'hints.FileLike' = None, | ||||||
|         *, |         *, | ||||||
|         download_big: bool = True) -> typing.Optional[str]: |         download_big: bool = True) -> typing.Optional[str]: | ||||||
|     """ |  | ||||||
|     Downloads the profile photo from the given user, chat or channel. |  | ||||||
| 
 |  | ||||||
|     Arguments |  | ||||||
|         entity (`entity`): |  | ||||||
|             From who the photo will be downloaded. |  | ||||||
| 
 |  | ||||||
|             .. note:: |  | ||||||
| 
 |  | ||||||
|                 This method expects the full entity (which has the data |  | ||||||
|                 to download the photo), not an input variant. |  | ||||||
| 
 |  | ||||||
|                 It's possible that sometimes you can't fetch the entity |  | ||||||
|                 from its input (since you can get errors like |  | ||||||
|                 ``ChannelPrivateError``) but you already have it through |  | ||||||
|                 another call, like getting a forwarded message from it. |  | ||||||
| 
 |  | ||||||
|         file (`str` | `file`, optional): |  | ||||||
|             The output file path, directory, or stream-like object. |  | ||||||
|             If the path exists and is a file, it will be overwritten. |  | ||||||
|             If file is the type `bytes`, it will be downloaded in-memory |  | ||||||
|             as a bytestring (e.g. ``file=bytes``). |  | ||||||
| 
 |  | ||||||
|         download_big (`bool`, optional): |  | ||||||
|             Whether to use the big version of the available photos. |  | ||||||
| 
 |  | ||||||
|     Returns |  | ||||||
|         `None` if no photo was provided, or if it was Empty. On success |  | ||||||
|         the file path is returned since it may differ from the one given. |  | ||||||
| 
 |  | ||||||
|     Example |  | ||||||
|         .. code-block:: python |  | ||||||
| 
 |  | ||||||
|             # Download your own profile photo |  | ||||||
|             path = await client.download_profile_photo('me') |  | ||||||
|             print(path) |  | ||||||
|     """ |  | ||||||
|     # hex(crc32(x.encode('ascii'))) for x in |     # hex(crc32(x.encode('ascii'))) for x in | ||||||
|     # ('User', 'Chat', 'UserFull', 'ChatFull') |     # ('User', 'Chat', 'UserFull', 'ChatFull') | ||||||
|     ENTITIES = (0x2da17977, 0xc5af5d94, 0x1f4661b9, 0xd49a2697) |     ENTITIES = (0x2da17977, 0xc5af5d94, 0x1f4661b9, 0xd49a2697) | ||||||
|  | @ -307,73 +270,6 @@ async def download_media( | ||||||
|         *, |         *, | ||||||
|         thumb: 'typing.Union[int, types.TypePhotoSize]' = None, |         thumb: 'typing.Union[int, types.TypePhotoSize]' = None, | ||||||
|         progress_callback: 'hints.ProgressCallback' = None) -> typing.Optional[typing.Union[str, bytes]]: |         progress_callback: 'hints.ProgressCallback' = None) -> typing.Optional[typing.Union[str, bytes]]: | ||||||
|     """ |  | ||||||
|     Downloads the given media from a message object. |  | ||||||
| 
 |  | ||||||
|     Note that if the download is too slow, you should consider installing |  | ||||||
|     ``cryptg`` (through ``pip install cryptg``) so that decrypting the |  | ||||||
|     received data is done in C instead of Python (much faster). |  | ||||||
| 
 |  | ||||||
|     See also `Message.download_media() <telethon.tl.custom.message.Message.download_media>`. |  | ||||||
| 
 |  | ||||||
|     Arguments |  | ||||||
|         message (`Message <telethon.tl.custom.message.Message>` | :tl:`Media`): |  | ||||||
|             The media or message containing the media that will be downloaded. |  | ||||||
| 
 |  | ||||||
|         file (`str` | `file`, optional): |  | ||||||
|             The output file path, directory, or stream-like object. |  | ||||||
|             If the path exists and is a file, it will be overwritten. |  | ||||||
|             If file is the type `bytes`, it will be downloaded in-memory |  | ||||||
|             as a bytestring (e.g. ``file=bytes``). |  | ||||||
| 
 |  | ||||||
|         progress_callback (`callable`, optional): |  | ||||||
|             A callback function accepting two parameters: |  | ||||||
|             ``(received bytes, total)``. |  | ||||||
| 
 |  | ||||||
|         thumb (`int` | :tl:`PhotoSize`, optional): |  | ||||||
|             Which thumbnail size from the document or photo to download, |  | ||||||
|             instead of downloading the document or photo itself. |  | ||||||
| 
 |  | ||||||
|             If it's specified but the file does not have a thumbnail, |  | ||||||
|             this method will return `None`. |  | ||||||
| 
 |  | ||||||
|             The parameter should be an integer index between ``0`` and |  | ||||||
|             ``len(sizes)``. ``0`` will download the smallest thumbnail, |  | ||||||
|             and ``len(sizes) - 1`` will download the largest thumbnail. |  | ||||||
|             You can also use negative indices, which work the same as |  | ||||||
|             they do in Python's `list`. |  | ||||||
| 
 |  | ||||||
|             You can also pass the :tl:`PhotoSize` instance to use. |  | ||||||
|             Alternatively, the thumb size type `str` may be used. |  | ||||||
| 
 |  | ||||||
|             In short, use ``thumb=0`` if you want the smallest thumbnail |  | ||||||
|             and ``thumb=-1`` if you want the largest thumbnail. |  | ||||||
| 
 |  | ||||||
|             .. note:: |  | ||||||
|                 The largest thumbnail may be a video instead of a photo, |  | ||||||
|                 as they are available since layer 116 and are bigger than |  | ||||||
|                 any of the photos. |  | ||||||
| 
 |  | ||||||
|     Returns |  | ||||||
|         `None` if no media was provided, or if it was Empty. On success |  | ||||||
|         the file path is returned since it may differ from the one given. |  | ||||||
| 
 |  | ||||||
|     Example |  | ||||||
|         .. code-block:: python |  | ||||||
| 
 |  | ||||||
|             path = await client.download_media(message) |  | ||||||
|             await client.download_media(message, filename) |  | ||||||
|             # or |  | ||||||
|             path = await message.download_media() |  | ||||||
|             await message.download_media(filename) |  | ||||||
| 
 |  | ||||||
|             # Printing download progress |  | ||||||
|             def callback(current, total): |  | ||||||
|                 print('Downloaded', current, 'out of', total, |  | ||||||
|                         'bytes: {:.2%}'.format(current / total)) |  | ||||||
| 
 |  | ||||||
|             await client.download_media(message, progress_callback=callback) |  | ||||||
|     """ |  | ||||||
|     # Downloading large documents may be slow enough to require a new file reference |     # Downloading large documents may be slow enough to require a new file reference | ||||||
|     # to be obtained mid-download. Store (input chat, message id) so that the message |     # to be obtained mid-download. Store (input chat, message id) so that the message | ||||||
|     # can be re-fetched. |     # can be re-fetched. | ||||||
|  | @ -428,58 +324,6 @@ async def download_file( | ||||||
|         dc_id: int = None, |         dc_id: int = None, | ||||||
|         key: bytes = None, |         key: bytes = None, | ||||||
|         iv: bytes = None) -> typing.Optional[bytes]: |         iv: bytes = None) -> typing.Optional[bytes]: | ||||||
|     """ |  | ||||||
|     Low-level method to download files from their input location. |  | ||||||
| 
 |  | ||||||
|     .. note:: |  | ||||||
| 
 |  | ||||||
|         Generally, you should instead use `download_media`. |  | ||||||
|         This method is intended to be a bit more low-level. |  | ||||||
| 
 |  | ||||||
|     Arguments |  | ||||||
|         input_location (:tl:`InputFileLocation`): |  | ||||||
|             The file location from which the file will be downloaded. |  | ||||||
|             See `telethon.utils.get_input_location` source for a complete |  | ||||||
|             list of supported types. |  | ||||||
| 
 |  | ||||||
|         file (`str` | `file`, optional): |  | ||||||
|             The output file path, directory, or stream-like object. |  | ||||||
|             If the path exists and is a file, it will be overwritten. |  | ||||||
| 
 |  | ||||||
|             If the file path is `None` or `bytes`, then the result |  | ||||||
|             will be saved in memory and returned as `bytes`. |  | ||||||
| 
 |  | ||||||
|         part_size_kb (`int`, optional): |  | ||||||
|             Chunk size when downloading files. The larger, the less |  | ||||||
|             requests will be made (up to 512KB maximum). |  | ||||||
| 
 |  | ||||||
|         file_size (`int`, optional): |  | ||||||
|             The file size that is about to be downloaded, if known. |  | ||||||
|             Only used if ``progress_callback`` is specified. |  | ||||||
| 
 |  | ||||||
|         progress_callback (`callable`, optional): |  | ||||||
|             A callback function accepting two parameters: |  | ||||||
|             ``(downloaded bytes, total)``. Note that the |  | ||||||
|             ``total`` is the provided ``file_size``. |  | ||||||
| 
 |  | ||||||
|         dc_id (`int`, optional): |  | ||||||
|             The data center the library should connect to in order |  | ||||||
|             to download the file. You shouldn't worry about this. |  | ||||||
| 
 |  | ||||||
|         key ('bytes', optional): |  | ||||||
|             In case of an encrypted upload (secret chats) a key is supplied |  | ||||||
| 
 |  | ||||||
|         iv ('bytes', optional): |  | ||||||
|             In case of an encrypted upload (secret chats) an iv is supplied |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     Example |  | ||||||
|         .. code-block:: python |  | ||||||
| 
 |  | ||||||
|             # Download a file and print its header |  | ||||||
|             data = await client.download_file(input_file, bytes) |  | ||||||
|             print(data[:16]) |  | ||||||
|     """ |  | ||||||
|     return await self._download_file( |     return await self._download_file( | ||||||
|         input_location, |         input_location, | ||||||
|         file, |         file, | ||||||
|  | @ -563,89 +407,6 @@ def iter_download( | ||||||
|         file_size: int = None, |         file_size: int = None, | ||||||
|         dc_id: int = None |         dc_id: int = None | ||||||
| ): | ): | ||||||
|     """ |  | ||||||
|     Iterates over a file download, yielding chunks of the file. |  | ||||||
| 
 |  | ||||||
|     This method can be used to stream files in a more convenient |  | ||||||
|     way, since it offers more control (pausing, resuming, etc.) |  | ||||||
| 
 |  | ||||||
|     .. note:: |  | ||||||
| 
 |  | ||||||
|         Using a value for `offset` or `stride` which is not a multiple |  | ||||||
|         of the minimum allowed `request_size`, or if `chunk_size` is |  | ||||||
|         different from `request_size`, the library will need to do a |  | ||||||
|         bit more work to fetch the data in the way you intend it to. |  | ||||||
| 
 |  | ||||||
|         You normally shouldn't worry about this. |  | ||||||
| 
 |  | ||||||
|     Arguments |  | ||||||
|         file (`hints.FileLike`): |  | ||||||
|             The file of which contents you want to iterate over. |  | ||||||
| 
 |  | ||||||
|         offset (`int`, optional): |  | ||||||
|             The offset in bytes into the file from where the |  | ||||||
|             download should start. For example, if a file is |  | ||||||
|             1024KB long and you just want the last 512KB, you |  | ||||||
|             would use ``offset=512 * 1024``. |  | ||||||
| 
 |  | ||||||
|         stride (`int`, optional): |  | ||||||
|             The stride of each chunk (how much the offset should |  | ||||||
|             advance between reading each chunk). This parameter |  | ||||||
|             should only be used for more advanced use cases. |  | ||||||
| 
 |  | ||||||
|             It must be bigger than or equal to the `chunk_size`. |  | ||||||
| 
 |  | ||||||
|         limit (`int`, optional): |  | ||||||
|             The limit for how many *chunks* will be yielded at most. |  | ||||||
| 
 |  | ||||||
|         chunk_size (`int`, optional): |  | ||||||
|             The maximum size of the chunks that will be yielded. |  | ||||||
|             Note that the last chunk may be less than this value. |  | ||||||
|             By default, it equals to `request_size`. |  | ||||||
| 
 |  | ||||||
|         request_size (`int`, optional): |  | ||||||
|             How many bytes will be requested to Telegram when more |  | ||||||
|             data is required. By default, as many bytes as possible |  | ||||||
|             are requested. If you would like to request data in |  | ||||||
|             smaller sizes, adjust this parameter. |  | ||||||
| 
 |  | ||||||
|             Note that values outside the valid range will be clamped, |  | ||||||
|             and the final value will also be a multiple of the minimum |  | ||||||
|             allowed size. |  | ||||||
| 
 |  | ||||||
|         file_size (`int`, optional): |  | ||||||
|             If the file size is known beforehand, you should set |  | ||||||
|             this parameter to said value. Depending on the type of |  | ||||||
|             the input file passed, this may be set automatically. |  | ||||||
| 
 |  | ||||||
|         dc_id (`int`, optional): |  | ||||||
|             The data center the library should connect to in order |  | ||||||
|             to download the file. You shouldn't worry about this. |  | ||||||
| 
 |  | ||||||
|     Yields |  | ||||||
| 
 |  | ||||||
|         `bytes` objects representing the chunks of the file if the |  | ||||||
|         right conditions are met, or `memoryview` objects instead. |  | ||||||
| 
 |  | ||||||
|     Example |  | ||||||
|         .. code-block:: python |  | ||||||
| 
 |  | ||||||
|             # Streaming `media` to an output file |  | ||||||
|             # After the iteration ends, the sender is cleaned up |  | ||||||
|             with open('photo.jpg', 'wb') as fd: |  | ||||||
|                 async for chunk in client.iter_download(media): |  | ||||||
|                     fd.write(chunk) |  | ||||||
| 
 |  | ||||||
|             # Fetching only the header of a file (32 bytes) |  | ||||||
|             # You should manually close the iterator in this case. |  | ||||||
|             # |  | ||||||
|             # "stream" is a common name for asynchronous generators, |  | ||||||
|             # and iter_download will yield `bytes` (chunks of the file). |  | ||||||
|             stream = client.iter_download(media, request_size=32) |  | ||||||
|             header = await stream.__anext__()  # "manual" version of `async for` |  | ||||||
|             await stream.close() |  | ||||||
|             assert len(header) == 32 |  | ||||||
|     """ |  | ||||||
|     return self._iter_download( |     return self._iter_download( | ||||||
|         file, |         file, | ||||||
|         offset=offset, |         offset=offset, | ||||||
|  |  | ||||||
|  | @ -10,38 +10,6 @@ if typing.TYPE_CHECKING: | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def get_parse_mode(self: 'TelegramClient'): | def get_parse_mode(self: 'TelegramClient'): | ||||||
|     """ |  | ||||||
|     This property is the default parse mode used when sending messages. |  | ||||||
|     Defaults to `telethon.extensions.markdown`. It will always |  | ||||||
|     be either `None` or an object with ``parse`` and ``unparse`` |  | ||||||
|     methods. |  | ||||||
| 
 |  | ||||||
|     When setting a different value it should be one of: |  | ||||||
| 
 |  | ||||||
|     * Object with ``parse`` and ``unparse`` methods. |  | ||||||
|     * A ``callable`` to act as the parse method. |  | ||||||
|     * A `str` indicating the ``parse_mode``. For Markdown ``'md'`` |  | ||||||
|         or ``'markdown'`` may be used. For HTML, ``'htm'`` or ``'html'`` |  | ||||||
|         may be used. |  | ||||||
| 
 |  | ||||||
|     The ``parse`` method should be a function accepting a single |  | ||||||
|     parameter, the text to parse, and returning a tuple consisting |  | ||||||
|     of ``(parsed message str, [MessageEntity instances])``. |  | ||||||
| 
 |  | ||||||
|     The ``unparse`` method should be the inverse of ``parse`` such |  | ||||||
|     that ``assert text == unparse(*parse(text))``. |  | ||||||
| 
 |  | ||||||
|     See :tl:`MessageEntity` for allowed message entities. |  | ||||||
| 
 |  | ||||||
|     Example |  | ||||||
|         .. code-block:: python |  | ||||||
| 
 |  | ||||||
|             # Disabling default formatting |  | ||||||
|             client.parse_mode = None |  | ||||||
| 
 |  | ||||||
|             # Enabling HTML as the default format |  | ||||||
|             client.parse_mode = 'html' |  | ||||||
|     """ |  | ||||||
|     return self._parse_mode |     return self._parse_mode | ||||||
| 
 | 
 | ||||||
| def set_parse_mode(self: 'TelegramClient', mode: str): | def set_parse_mode(self: 'TelegramClient', mode: str): | ||||||
|  |  | ||||||
|  | @ -30,74 +30,14 @@ async def _run_until_disconnected(self: 'TelegramClient'): | ||||||
|         await self.disconnect() |         await self.disconnect() | ||||||
| 
 | 
 | ||||||
| async def set_receive_updates(self: 'TelegramClient', receive_updates): | async def set_receive_updates(self: 'TelegramClient', receive_updates): | ||||||
|     """ |  | ||||||
|     Change the value of `receive_updates`. |  | ||||||
| 
 |  | ||||||
|     This is an `async` method, because in order for Telegram to start |  | ||||||
|     sending updates again, a request must be made. |  | ||||||
|     """ |  | ||||||
|     self._no_updates = not receive_updates |     self._no_updates = not receive_updates | ||||||
|     if receive_updates: |     if receive_updates: | ||||||
|         await self(functions.updates.GetStateRequest()) |         await self(functions.updates.GetStateRequest()) | ||||||
| 
 | 
 | ||||||
| async def run_until_disconnected(self: 'TelegramClient'): | async def run_until_disconnected(self: 'TelegramClient'): | ||||||
|     """ |  | ||||||
|     Runs the event loop until the library is disconnected. |  | ||||||
| 
 |  | ||||||
|     It also notifies Telegram that we want to receive updates |  | ||||||
|     as described in https://core.telegram.org/api/updates. |  | ||||||
| 
 |  | ||||||
|     Manual disconnections can be made by calling `disconnect() |  | ||||||
|     <telethon.client.telegrambaseclient.TelegramBaseClient.disconnect>` |  | ||||||
|     or sending a ``KeyboardInterrupt`` (e.g. by pressing ``Ctrl+C`` on |  | ||||||
|     the console window running the script). |  | ||||||
| 
 |  | ||||||
|     If a disconnection error occurs (i.e. the library fails to reconnect |  | ||||||
|     automatically), said error will be raised through here, so you have a |  | ||||||
|     chance to ``except`` it on your own code. |  | ||||||
| 
 |  | ||||||
|     If the loop is already running, this method returns a coroutine |  | ||||||
|     that you should await on your own code. |  | ||||||
| 
 |  | ||||||
|     .. note:: |  | ||||||
| 
 |  | ||||||
|         If you want to handle ``KeyboardInterrupt`` in your code, |  | ||||||
|         simply run the event loop in your code too in any way, such as |  | ||||||
|         ``loop.run_forever()`` or ``await client.disconnected`` (e.g. |  | ||||||
|         ``loop.run_until_complete(client.disconnected)``). |  | ||||||
| 
 |  | ||||||
|     Example |  | ||||||
|         .. code-block:: python |  | ||||||
| 
 |  | ||||||
|             # Blocks the current task here until a disconnection occurs. |  | ||||||
|             # |  | ||||||
|             # You will still receive updates, since this prevents the |  | ||||||
|             # script from exiting. |  | ||||||
|             await client.run_until_disconnected() |  | ||||||
|     """ |  | ||||||
|     return await self._run_until_disconnected() |     return await self._run_until_disconnected() | ||||||
| 
 | 
 | ||||||
| def on(self: 'TelegramClient', event: EventBuilder): | def on(self: 'TelegramClient', event: EventBuilder): | ||||||
|     """ |  | ||||||
|     Decorator used to `add_event_handler` more conveniently. |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     Arguments |  | ||||||
|         event (`_EventBuilder` | `type`): |  | ||||||
|             The event builder class or instance to be used, |  | ||||||
|             for instance ``events.NewMessage``. |  | ||||||
| 
 |  | ||||||
|     Example |  | ||||||
|         .. code-block:: python |  | ||||||
| 
 |  | ||||||
|             from telethon import TelegramClient, events |  | ||||||
|             client = TelegramClient(...) |  | ||||||
| 
 |  | ||||||
|             # Here we use client.on |  | ||||||
|             @client.on(events.NewMessage) |  | ||||||
|             async def handler(event): |  | ||||||
|                 ... |  | ||||||
|     """ |  | ||||||
|     def decorator(f): |     def decorator(f): | ||||||
|         self.add_event_handler(f, event) |         self.add_event_handler(f, event) | ||||||
|         return f |         return f | ||||||
|  | @ -108,38 +48,6 @@ def add_event_handler( | ||||||
|         self: 'TelegramClient', |         self: 'TelegramClient', | ||||||
|         callback: Callback, |         callback: Callback, | ||||||
|         event: EventBuilder = None): |         event: EventBuilder = None): | ||||||
|     """ |  | ||||||
|     Registers a new event handler callback. |  | ||||||
| 
 |  | ||||||
|     The callback will be called when the specified event occurs. |  | ||||||
| 
 |  | ||||||
|     Arguments |  | ||||||
|         callback (`callable`): |  | ||||||
|             The callable function accepting one parameter to be used. |  | ||||||
| 
 |  | ||||||
|             Note that if you have used `telethon.events.register` in |  | ||||||
|             the callback, ``event`` will be ignored, and instead the |  | ||||||
|             events you previously registered will be used. |  | ||||||
| 
 |  | ||||||
|         event (`_EventBuilder` | `type`, optional): |  | ||||||
|             The event builder class or instance to be used, |  | ||||||
|             for instance ``events.NewMessage``. |  | ||||||
| 
 |  | ||||||
|             If left unspecified, `telethon.events.raw.Raw` (the |  | ||||||
|             :tl:`Update` objects with no further processing) will |  | ||||||
|             be passed instead. |  | ||||||
| 
 |  | ||||||
|     Example |  | ||||||
|         .. code-block:: python |  | ||||||
| 
 |  | ||||||
|             from telethon import TelegramClient, events |  | ||||||
|             client = TelegramClient(...) |  | ||||||
| 
 |  | ||||||
|             async def handler(event): |  | ||||||
|                 ... |  | ||||||
| 
 |  | ||||||
|             client.add_event_handler(handler, events.NewMessage) |  | ||||||
|     """ |  | ||||||
|     builders = events._get_handlers(callback) |     builders = events._get_handlers(callback) | ||||||
|     if builders is not None: |     if builders is not None: | ||||||
|         for event in builders: |         for event in builders: | ||||||
|  | @ -157,27 +65,6 @@ def remove_event_handler( | ||||||
|         self: 'TelegramClient', |         self: 'TelegramClient', | ||||||
|         callback: Callback, |         callback: Callback, | ||||||
|         event: EventBuilder = None) -> int: |         event: EventBuilder = None) -> int: | ||||||
|     """ |  | ||||||
|     Inverse operation of `add_event_handler()`. |  | ||||||
| 
 |  | ||||||
|     If no event is given, all events for this callback are removed. |  | ||||||
|     Returns how many callbacks were removed. |  | ||||||
| 
 |  | ||||||
|     Example |  | ||||||
|         .. code-block:: python |  | ||||||
| 
 |  | ||||||
|             @client.on(events.Raw) |  | ||||||
|             @client.on(events.NewMessage) |  | ||||||
|             async def handler(event): |  | ||||||
|                 ... |  | ||||||
| 
 |  | ||||||
|             # Removes only the "Raw" handling |  | ||||||
|             # "handler" will still receive "events.NewMessage" |  | ||||||
|             client.remove_event_handler(handler, events.Raw) |  | ||||||
| 
 |  | ||||||
|             # "handler" will stop receiving anything |  | ||||||
|             client.remove_event_handler(handler) |  | ||||||
|     """ |  | ||||||
|     found = 0 |     found = 0 | ||||||
|     if event and not isinstance(event, type): |     if event and not isinstance(event, type): | ||||||
|         event = type(event) |         event = type(event) | ||||||
|  | @ -194,38 +81,9 @@ def remove_event_handler( | ||||||
| 
 | 
 | ||||||
| def list_event_handlers(self: 'TelegramClient')\ | def list_event_handlers(self: 'TelegramClient')\ | ||||||
|         -> 'typing.Sequence[typing.Tuple[Callback, EventBuilder]]': |         -> 'typing.Sequence[typing.Tuple[Callback, EventBuilder]]': | ||||||
|     """ |  | ||||||
|     Lists all registered event handlers. |  | ||||||
| 
 |  | ||||||
|     Returns |  | ||||||
|         A list of pairs consisting of ``(callback, event)``. |  | ||||||
| 
 |  | ||||||
|     Example |  | ||||||
|         .. code-block:: python |  | ||||||
| 
 |  | ||||||
|             @client.on(events.NewMessage(pattern='hello')) |  | ||||||
|             async def on_greeting(event): |  | ||||||
|                 '''Greets someone''' |  | ||||||
|                 await event.reply('Hi') |  | ||||||
| 
 |  | ||||||
|             for callback, event in client.list_event_handlers(): |  | ||||||
|                 print(id(callback), type(event)) |  | ||||||
|     """ |  | ||||||
|     return [(callback, event) for event, callback in self._event_builders] |     return [(callback, event) for event, callback in self._event_builders] | ||||||
| 
 | 
 | ||||||
| async def catch_up(self: 'TelegramClient'): | async def catch_up(self: 'TelegramClient'): | ||||||
|     """ |  | ||||||
|     "Catches up" on the missed updates while the client was offline. |  | ||||||
|     You should call this method after registering the event handlers |  | ||||||
|     so that the updates it loads can by processed by your script. |  | ||||||
| 
 |  | ||||||
|     This can also be used to forcibly fetch new updates if there are any. |  | ||||||
| 
 |  | ||||||
|     Example |  | ||||||
|         .. code-block:: python |  | ||||||
| 
 |  | ||||||
|             await client.catch_up() |  | ||||||
|     """ |  | ||||||
|     pts, date = self._state_cache[None] |     pts, date = self._state_cache[None] | ||||||
|     if not pts: |     if not pts: | ||||||
|         return |         return | ||||||
|  |  | ||||||
|  | @ -129,26 +129,6 @@ async def call(self: 'TelegramClient', sender, request, ordered=False, flood_sle | ||||||
| 
 | 
 | ||||||
| async def get_me(self: 'TelegramClient', input_peer: bool = False) \ | async def get_me(self: 'TelegramClient', input_peer: bool = False) \ | ||||||
|         -> 'typing.Union[types.User, types.InputPeerUser]': |         -> 'typing.Union[types.User, types.InputPeerUser]': | ||||||
|     """ |  | ||||||
|     Gets "me", the current :tl:`User` who is logged in. |  | ||||||
| 
 |  | ||||||
|     If the user has not logged in yet, this method returns `None`. |  | ||||||
| 
 |  | ||||||
|     Arguments |  | ||||||
|         input_peer (`bool`, optional): |  | ||||||
|             Whether to return the :tl:`InputPeerUser` version or the normal |  | ||||||
|             :tl:`User`. This can be useful if you just need to know the ID |  | ||||||
|             of yourself. |  | ||||||
| 
 |  | ||||||
|     Returns |  | ||||||
|         Your own :tl:`User`. |  | ||||||
| 
 |  | ||||||
|     Example |  | ||||||
|         .. code-block:: python |  | ||||||
| 
 |  | ||||||
|             me = await client.get_me() |  | ||||||
|             print(me.username) |  | ||||||
|     """ |  | ||||||
|     if input_peer and self._self_input_peer: |     if input_peer and self._self_input_peer: | ||||||
|         return self._self_input_peer |         return self._self_input_peer | ||||||
| 
 | 
 | ||||||
|  | @ -176,34 +156,12 @@ def _self_id(self: 'TelegramClient') -> typing.Optional[int]: | ||||||
|     return self._self_input_peer.user_id if self._self_input_peer else None |     return self._self_input_peer.user_id if self._self_input_peer else None | ||||||
| 
 | 
 | ||||||
| async def is_bot(self: 'TelegramClient') -> bool: | async def is_bot(self: 'TelegramClient') -> bool: | ||||||
|     """ |  | ||||||
|     Return `True` if the signed-in user is a bot, `False` otherwise. |  | ||||||
| 
 |  | ||||||
|     Example |  | ||||||
|         .. code-block:: python |  | ||||||
| 
 |  | ||||||
|             if await client.is_bot(): |  | ||||||
|                 print('Beep') |  | ||||||
|             else: |  | ||||||
|                 print('Hello') |  | ||||||
|     """ |  | ||||||
|     if self._bot is None: |     if self._bot is None: | ||||||
|         self._bot = (await self.get_me()).bot |         self._bot = (await self.get_me()).bot | ||||||
| 
 | 
 | ||||||
|     return self._bot |     return self._bot | ||||||
| 
 | 
 | ||||||
| async def is_user_authorized(self: 'TelegramClient') -> bool: | async def is_user_authorized(self: 'TelegramClient') -> bool: | ||||||
|     """ |  | ||||||
|     Returns `True` if the user is authorized (logged in). |  | ||||||
| 
 |  | ||||||
|     Example |  | ||||||
|         .. code-block:: python |  | ||||||
| 
 |  | ||||||
|             if not await client.is_user_authorized(): |  | ||||||
|                 await client.send_code_request(phone) |  | ||||||
|                 code = input('enter code: ') |  | ||||||
|                 await client.sign_in(phone, code) |  | ||||||
|     """ |  | ||||||
|     if self._authorized is None: |     if self._authorized is None: | ||||||
|         try: |         try: | ||||||
|             # Any request that requires authorization will work |             # Any request that requires authorization will work | ||||||
|  | @ -217,59 +175,6 @@ async def is_user_authorized(self: 'TelegramClient') -> bool: | ||||||
| async def get_entity( | async def get_entity( | ||||||
|         self: 'TelegramClient', |         self: 'TelegramClient', | ||||||
|         entity: 'hints.EntitiesLike') -> 'hints.Entity': |         entity: 'hints.EntitiesLike') -> 'hints.Entity': | ||||||
|     """ |  | ||||||
|     Turns the given entity into a valid Telegram :tl:`User`, :tl:`Chat` |  | ||||||
|     or :tl:`Channel`. You can also pass a list or iterable of entities, |  | ||||||
|     and they will be efficiently fetched from the network. |  | ||||||
| 
 |  | ||||||
|     Arguments |  | ||||||
|         entity (`str` | `int` | :tl:`Peer` | :tl:`InputPeer`): |  | ||||||
|             If a username is given, **the username will be resolved** making |  | ||||||
|             an API call every time. Resolving usernames is an expensive |  | ||||||
|             operation and will start hitting flood waits around 50 usernames |  | ||||||
|             in a short period of time. |  | ||||||
| 
 |  | ||||||
|             If you want to get the entity for a *cached* username, you should |  | ||||||
|             first `get_input_entity(username) <get_input_entity>` which will |  | ||||||
|             use the cache), and then use `get_entity` with the result of the |  | ||||||
|             previous call. |  | ||||||
| 
 |  | ||||||
|             Similar limits apply to invite links, and you should use their |  | ||||||
|             ID instead. |  | ||||||
| 
 |  | ||||||
|             Using phone numbers (from people in your contact list), exact |  | ||||||
|             names, integer IDs or :tl:`Peer` rely on a `get_input_entity` |  | ||||||
|             first, which in turn needs the entity to be in cache, unless |  | ||||||
|             a :tl:`InputPeer` was passed. |  | ||||||
| 
 |  | ||||||
|             Unsupported types will raise ``TypeError``. |  | ||||||
| 
 |  | ||||||
|             If the entity can't be found, ``ValueError`` will be raised. |  | ||||||
| 
 |  | ||||||
|     Returns |  | ||||||
|         :tl:`User`, :tl:`Chat` or :tl:`Channel` corresponding to the |  | ||||||
|         input entity. A list will be returned if more than one was given. |  | ||||||
| 
 |  | ||||||
|     Example |  | ||||||
|         .. code-block:: python |  | ||||||
| 
 |  | ||||||
|             from telethon import utils |  | ||||||
| 
 |  | ||||||
|             me = await client.get_entity('me') |  | ||||||
|             print(utils.get_display_name(me)) |  | ||||||
| 
 |  | ||||||
|             chat = await client.get_input_entity('username') |  | ||||||
|             async for message in client.iter_messages(chat): |  | ||||||
|                 ... |  | ||||||
| 
 |  | ||||||
|             # Note that you could have used the username directly, but it's |  | ||||||
|             # good to use get_input_entity if you will reuse it a lot. |  | ||||||
|             async for message in client.iter_messages('username'): |  | ||||||
|                 ... |  | ||||||
| 
 |  | ||||||
|             # Note that for this to work the phone number must be in your contacts |  | ||||||
|             some_id = await client.get_peer_id('+34123456789') |  | ||||||
|     """ |  | ||||||
|     single = not utils.is_list_like(entity) |     single = not utils.is_list_like(entity) | ||||||
|     if single: |     if single: | ||||||
|         entity = (entity,) |         entity = (entity,) | ||||||
|  | @ -340,67 +245,6 @@ async def get_entity( | ||||||
| async def get_input_entity( | async def get_input_entity( | ||||||
|         self: 'TelegramClient', |         self: 'TelegramClient', | ||||||
|         peer: 'hints.EntityLike') -> 'types.TypeInputPeer': |         peer: 'hints.EntityLike') -> 'types.TypeInputPeer': | ||||||
|     """ |  | ||||||
|     Turns the given entity into its input entity version. |  | ||||||
| 
 |  | ||||||
|     Most requests use this kind of :tl:`InputPeer`, so this is the most |  | ||||||
|     suitable call to make for those cases. **Generally you should let the |  | ||||||
|     library do its job** and don't worry about getting the input entity |  | ||||||
|     first, but if you're going to use an entity often, consider making the |  | ||||||
|     call: |  | ||||||
| 
 |  | ||||||
|     Arguments |  | ||||||
|         entity (`str` | `int` | :tl:`Peer` | :tl:`InputPeer`): |  | ||||||
|             If a username or invite link is given, **the library will |  | ||||||
|             use the cache**. This means that it's possible to be using |  | ||||||
|             a username that *changed* or an old invite link (this only |  | ||||||
|             happens if an invite link for a small group chat is used |  | ||||||
|             after it was upgraded to a mega-group). |  | ||||||
| 
 |  | ||||||
|             If the username or ID from the invite link is not found in |  | ||||||
|             the cache, it will be fetched. The same rules apply to phone |  | ||||||
|             numbers (``'+34 123456789'``) from people in your contact list. |  | ||||||
| 
 |  | ||||||
|             If an exact name is given, it must be in the cache too. This |  | ||||||
|             is not reliable as different people can share the same name |  | ||||||
|             and which entity is returned is arbitrary, and should be used |  | ||||||
|             only for quick tests. |  | ||||||
| 
 |  | ||||||
|             If a positive integer ID is given, the entity will be searched |  | ||||||
|             in cached users, chats or channels, without making any call. |  | ||||||
| 
 |  | ||||||
|             If a negative integer ID is given, the entity will be searched |  | ||||||
|             exactly as either a chat (prefixed with ``-``) or as a channel |  | ||||||
|             (prefixed with ``-100``). |  | ||||||
| 
 |  | ||||||
|             If a :tl:`Peer` is given, it will be searched exactly in the |  | ||||||
|             cache as either a user, chat or channel. |  | ||||||
| 
 |  | ||||||
|             If the given object can be turned into an input entity directly, |  | ||||||
|             said operation will be done. |  | ||||||
| 
 |  | ||||||
|             Unsupported types will raise ``TypeError``. |  | ||||||
| 
 |  | ||||||
|             If the entity can't be found, ``ValueError`` will be raised. |  | ||||||
| 
 |  | ||||||
|     Returns |  | ||||||
|         :tl:`InputPeerUser`, :tl:`InputPeerChat` or :tl:`InputPeerChannel` |  | ||||||
|         or :tl:`InputPeerSelf` if the parameter is ``'me'`` or ``'self'``. |  | ||||||
| 
 |  | ||||||
|         If you need to get the ID of yourself, you should use |  | ||||||
|         `get_me` with ``input_peer=True``) instead. |  | ||||||
| 
 |  | ||||||
|     Example |  | ||||||
|         .. code-block:: python |  | ||||||
| 
 |  | ||||||
|             # If you're going to use "username" often in your code |  | ||||||
|             # (make a lot of calls), consider getting its input entity |  | ||||||
|             # once, and then using the "user" everywhere instead. |  | ||||||
|             user = await client.get_input_entity('username') |  | ||||||
| 
 |  | ||||||
|             # The same applies to IDs, chats or channels. |  | ||||||
|             chat = await client.get_input_entity(-123456789) |  | ||||||
|     """ |  | ||||||
|     # Short-circuit if the input parameter directly maps to an InputPeer |     # Short-circuit if the input parameter directly maps to an InputPeer | ||||||
|     try: |     try: | ||||||
|         return utils.get_input_peer(peer) |         return utils.get_input_peer(peer) | ||||||
|  | @ -472,20 +316,6 @@ async def get_peer_id( | ||||||
|         self: 'TelegramClient', |         self: 'TelegramClient', | ||||||
|         peer: 'hints.EntityLike', |         peer: 'hints.EntityLike', | ||||||
|         add_mark: bool = True) -> int: |         add_mark: bool = True) -> int: | ||||||
|     """ |  | ||||||
|     Gets the ID for the given entity. |  | ||||||
| 
 |  | ||||||
|     This method needs to be ``async`` because `peer` supports usernames, |  | ||||||
|     invite-links, phone numbers (from people in your contact list), etc. |  | ||||||
| 
 |  | ||||||
|     If ``add_mark is False``, then a positive ID will be returned |  | ||||||
|     instead. By default, bot-API style IDs (signed) are returned. |  | ||||||
| 
 |  | ||||||
|     Example |  | ||||||
|         .. code-block:: python |  | ||||||
| 
 |  | ||||||
|             print(await client.get_peer_id('me')) |  | ||||||
|     """ |  | ||||||
|     if isinstance(peer, int): |     if isinstance(peer, int): | ||||||
|         return utils.get_peer_id(peer, add_mark=add_mark) |         return utils.get_peer_id(peer, add_mark=add_mark) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user