From 4da50ba3a0242481dc91af52d4158582e9fcd453 Mon Sep 17 00:00:00 2001 From: Lonami Exo Date: Mon, 25 Jun 2018 14:24:56 +0200 Subject: [PATCH] Add a syncify magic module to use asyncio as sync --- telethon/syncify.py | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 telethon/syncify.py diff --git a/telethon/syncify.py b/telethon/syncify.py new file mode 100644 index 00000000..6f524dd4 --- /dev/null +++ b/telethon/syncify.py @@ -0,0 +1,40 @@ +""" +This magical module will rewrite all public methods in the public interface +of the library so they can run the loop on their own if it's not already +running. This rewrite may not be desirable if the end user always uses the +methods they way they should be ran, but it's incredibly useful for quick +scripts and the runtime overhead is relatively low. + +Some really common methods which are hardly used offer this ability by +default, such as ``.start()`` and ``.run_until_disconnected()`` (since +you may want to start, and then run until disconnected while using async +event handlers). +""" +import asyncio +import functools +import inspect + +from .client.telegramclient import TelegramClient +from .tl.custom import Draft, Dialog, MessageButton, Forward, Message + + +def syncify(t, method_name): + method = getattr(t, method_name) + + @functools.wraps(method) + def syncified(*args, **kwargs): + coro = method(*args, **kwargs) + return ( + coro if asyncio.get_event_loop().is_running() + else asyncio.get_event_loop().run_until_complete(coro) + ) + + setattr(t, method_name, syncified) + + +for t in [TelegramClient, + Draft, Dialog, MessageButton, Forward, Message]: + for method_name in dir(t): + if not method_name.startswith('_') or method_name == '__call__': + if inspect.iscoroutinefunction(getattr(t, method_name)): + syncify(t, method_name)