Guest User

Untitled

a guest
Nov 24th, 2020
31
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.82 KB | None | 0 0
  1. import argparse
  2. import asyncio
  3. import nest_asyncio
  4.  
  5. from typing import Callable, Tuple, Union
  6.  
  7. from aiogram import Bot, Dispatcher, types
  8. from aiogram.contrib.fsm_storage.memory import MemoryStorage
  9. from aiogram.contrib.fsm_storage.redis import RedisStorage2
  10. from aiogram.utils import executor
  11. from aiohttp import web
  12.  
  13. from src.data.data_class.bot_data_class import BotConfig
  14. from src.data.data_class.host_data_class import ServerConfig
  15. from src.data.load_config import load_path
  16. from src.handlers.massage import register_message_handler
  17.  
  18.  
  19. class Service:
  20.     bot: Bot
  21.     dp: Dispatcher
  22.     server_config: ServerConfig
  23.     bot_config: BotConfig
  24.  
  25.     def __init__(self, load: Callable[[], Tuple[BotConfig, ServerConfig]],
  26.                  stge: Union[MemoryStorage, RedisStorage2], loop: asyncio.AbstractEventLoop):
  27.         self.loop = loop
  28.         self.bot_config, self.server_config = load()
  29.         self.bot = Bot(self.bot_config.token)
  30.         self.dp = Dispatcher(self.bot, storage=stge)
  31.  
  32.     async def on_startup(self, web_app: web.Application):
  33.         await self.bot.delete_webhook()
  34.         await self.bot.set_webhook(self.server_config.get_url)
  35.  
  36.     def webhook(self, app: web.Application):
  37.         app.on_startup.append(self.on_startup)
  38.         app.add_routes([web.post(self.server_config.get_url, self.execute)])
  39.         web.run_app(app, port=self.server_config.port, host=self.server_config.host)
  40.  
  41.     async def execute(self, req: web.Request) -> web.Response:
  42.         updates = [types.Update(**(await req.json()))]
  43.         Bot.set_current(self.dp.bot)
  44.         Dispatcher.set_current(self.dp)
  45.         try:
  46.             await self.dp.process_updates(updates)
  47.         except Exception as e:
  48.             print(e)
  49.         finally:
  50.             return web.Response()
  51.  
  52.     async def main(self, build: str):
  53.         register_message_handler(self.dp, self.bot)
  54.         if build == "polling":
  55.             print("start")
  56.             executor.start_polling(self.dp, on_shutdown=self.shutdown, loop=self.loop)
  57.         elif build == "webhook":
  58.             app = web.Application()
  59.             self.webhook(app)
  60.  
  61.     @staticmethod
  62.     async def shutdown(dispatcher: Dispatcher):
  63.         await dispatcher.storage.close()
  64.         await dispatcher.storage.wait_closed()
  65.  
  66.  
  67. if __name__ == '__main__':
  68.     parser = argparse.ArgumentParser(description='get arg')
  69.     parser.add_argument("--config")
  70.     parser.add_argument("--build")
  71.     parser.add_argument("--storage")
  72.     arg = parser.parse_args()
  73.     path_to_data = "./data/data.json"
  74.     loop = asyncio.get_event_loop()
  75.     nest_asyncio.apply()
  76.     storage = RedisStorage2() if arg.storage == "redis" else MemoryStorage()
  77.     service = Service(load=load_path(arg.build, path=path_to_data), stge=storage, loop=loop)
  78.     loop.run_until_complete(service.main(arg.build))
  79.  
Advertisement
Add Comment
Please, Sign In to add comment