nickoala / telepot

Python framework for Telegram Bot API
MIT License
2.43k stars 474 forks source link

Async Listener and Handler #451

Open Yaxit opened 5 years ago

Yaxit commented 5 years ago

Hello, I recently switched to the async version, and I'm trying to replicate the behavior I had before, which is the following. the bot must be able to do two different things:

This is the code in the standard (not async version) I used to run:

import telepot
from telepot.loop import MessageLoop
from multiprocessing.connection import Listener, Client
addr = ('localhost', 4000)
listener = Listener(addr)
telegram_id = "my ID"

def handle(msg):
    # do some processing and maybe sending a msg

bot = telepot.Bot(token)
MessageLoop(bot, handle).run_as_thread()
while True:
        conn = listener.accept()
        data = conn.recv()
        conn.close()
        # some processing on data
        bot.sendMessage(telegram_id, data)

I cannot replicate this behavior in the async version (I'm not very fond on async programming, actually) I tried many thing, including the following.

from multiprocessing.connection import Listener, Client
import asyncio
import telepot
import telepot.aio

addr = ('localhost', 4000)
listener = Listener(addr)
telegram_id = "myid"

async def get_data():
    print("Waiting for data")
    conn = listener.accept()
    data = conn.recv()
    conn.close()
    return data

async def internal_handle():
    while True:
        data = await asyncio.run(get_data())
        # process data
        await bot.sendMessage(telegram_id, data)

async def handle(msg):
    # same stuff as before

bot = telepot.aio.Bot("token")
loop = asyncio.get_event_loop()
loop.create_task(internal_handle())
loop.create_task(MessageLoop(bot, handle).run_forever())
loop.run_forever()

I thought this would run internale_handle() and the msg handler together, but it doesn't. Instead, it gets stuck waiting for data from the Listener. Thank you for any suggestion!