================= Project Structure ================= Main interface ************** The library itself is under the ``telethon/`` directory. The ``__init__.py`` file there exposes the main ``TelegramClient``, a class that servers as a nice interface with the most commonly used methods on Telegram such as sending messages, retrieving the message history, handling updates, etc. The ``TelegramClient`` inherits the ``TelegramBareClient``. The later is basically a pruned version of the ``TelegramClient``, which knows basic stuff like ``.invoke()``\ 'ing requests, downloading files, or switching between data centers. This is primary to keep the method count per class and file low and manageable. Both clients make use of the ``network/mtproto_sender.py``. The ``MtProtoSender`` class handles packing requests with the ``salt``, ``id``, ``sequence``, etc., and also handles how to process responses (i.e. pong, RPC errors). This class communicates through Telegram via its ``.connection`` member. The ``Connection`` class uses a ``extensions/tcp_client``, a C#-like ``TcpClient`` to ease working with sockets in Python. All the ``TcpClient`` know is how to connect through TCP and writing/reading from the socket with optional cancel. The ``Connection`` class bundles up all the connections modes and sends and receives the messages accordingly (TCP full, obfuscated, intermediate…). Auto-generated code ******************* The files under ``telethon_generator/`` are used to generate the code that gets placed under ``telethon/tl/``. The ``TLGenerator`` takes in a ``.tl`` file, and spits out the generated classes which represent, as Python classes, the request and types defined in the ``.tl`` file. It also constructs an index so that they can be imported easily.