From 17f2970020dceddb3cef67e728a87160e3d1ef75 Mon Sep 17 00:00:00 2001 From: typhoon Date: Fri, 13 May 2022 16:39:48 +1000 Subject: [PATCH] added fastapi based bot --- examples/echo_class_based_bot_asyncio.py | 8 +--- examples/echo_fastapi_based_bot.py | 55 ++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 6 deletions(-) create mode 100644 examples/echo_fastapi_based_bot.py diff --git a/examples/echo_class_based_bot_asyncio.py b/examples/echo_class_based_bot_asyncio.py index e478a36d..81b30325 100644 --- a/examples/echo_class_based_bot_asyncio.py +++ b/examples/echo_class_based_bot_asyncio.py @@ -2,7 +2,6 @@ from aiogram import Bot, Dispatcher, types import logging import asyncio - API_TOKEN = "" logging.basicConfig(level=logging.INFO) @@ -20,12 +19,9 @@ class AsyncioBot: await message.answer(f"Asnwer: {message.text}") async def run(self): - asyncio.create_task(self.dp.start_polling()) + await self.dp.start_polling() if __name__ == '__main__': bot = AsyncioBot() - loop = asyncio.get_event_loop() - loop.create_task(bot.run()) - - loop.run_forever() + asyncio.run(bot.run()) diff --git a/examples/echo_fastapi_based_bot.py b/examples/echo_fastapi_based_bot.py new file mode 100644 index 00000000..adf9d09e --- /dev/null +++ b/examples/echo_fastapi_based_bot.py @@ -0,0 +1,55 @@ +from fastapi_utils.inferring_router import InferringRouter +from fastapi import FastAPI, status, HTTPException +from aiogram import Bot, Dispatcher, types +from fastapi_utils.cbv import cbv +import logging +import asyncio + + +API_TOKEN = "" +logging.basicConfig(level=logging.DEBUG) + +class AsyncioBot: + + # Initialize bot and dispatcher + def __init__(self) -> None: + self.bot = Bot(token=API_TOKEN) + self.dp = Dispatcher(self.bot) + + self.dp.register_message_handler(self.on_message) + + async def on_message(self, message: types.Message): + print(message.get_command()) + await message.answer(f"Asnwer: {message.text}") + + async def run(self): + # await self.dp.start_polling() # will be blocking main :on_start: FastAPI event + asyncio.create_task(self.dp.start_polling()) + + async def close(self): + bot = self.bot.get_session() + bot.close() + + +app = FastAPI() +bot = AsyncioBot() +router = InferringRouter() + +@cbv(router) +class MainServer: + + @app.on_event("startup") + async def on_startup(): + await bot.run() + + @router.get("/echo", status_code=status.HTTP_200_OK) + async def echo(self): + return { + "status": True + } + + @app.on_event("shutdown") + async def on_shutdown(): + await bot.close() # closing bot without error + +app.include_router(router)