From bad1d79fcf0ad5b4356d144877e307dcc41bfa55 Mon Sep 17 00:00:00 2001 From: Dmitry Afanasyev Date: Tue, 9 Aug 2022 23:23:28 +0300 Subject: [PATCH] refactor app --- main.py => app/core/bot.py | 62 +++-------------------------- app/core/logger.py | 7 ++++ mos_gor.py => app/core/parse_web.py | 9 +---- app/core/scheduler.py | 20 ++++++++++ app/main.py | 39 ++++++++++++++++++ settings.py => app/settings.py | 2 +- gunicorn.sh | 27 ------------- scripts/start-bot.sh | 2 +- 8 files changed, 74 insertions(+), 94 deletions(-) rename main.py => app/core/bot.py (59%) create mode 100644 app/core/logger.py rename mos_gor.py => app/core/parse_web.py (90%) create mode 100644 app/core/scheduler.py create mode 100644 app/main.py rename settings.py => app/settings.py (94%) delete mode 100644 gunicorn.sh diff --git a/main.py b/app/core/bot.py similarity index 59% rename from main.py rename to app/core/bot.py index 222a077..b2a9e16 100644 --- a/main.py +++ b/app/core/bot.py @@ -5,25 +5,15 @@ from aiogram.contrib.middlewares.logging import LoggingMiddleware from aiogram.dispatcher import Dispatcher from aiogram.dispatcher.webhook import SendMessage from aiogram.utils.callback_data import CallbackData -from aiogram.utils.executor import start_webhook -from mos_gor import logger, parse_site, download_gecko_driver, configure_firefox_driver -from settings import API_TOKEN, WEBHOOK_URL, WEBHOOK_PATH, WEBAPP_HOST, WEBAPP_PORT +from core.parse_web import parse_site, configure_firefox_driver +from settings import API_TOKEN bot = Bot(token=API_TOKEN) dispatcher = Dispatcher(bot) dispatcher.middleware.setup(LoggingMiddleware()) -cron_jobs = [ - {'trigger': 'cron', 'day_of_week': 'mon-fri', 'hour': 8, 'minute': 59, 'second': 0}, - {'trigger': 'cron', 'day_of_week': 'mon-fri', 'hour': 9, 'minute': 4, 'second': 0}, - {'trigger': 'cron', 'day_of_week': 'mon-fri', 'hour': 9, 'minute': 9, 'second': 0}, - ] - -user_chat_ids = {'chat_ids': [417070387, # me - 431571617, # Lenok - ]} - +driver = configure_firefox_driver() stations_cb = CallbackData('station', 'direction') @@ -73,8 +63,8 @@ async def chat_id(message: types.Message) -> SendMessage: @dispatcher.message_handler() -async def echo(message: types.Message) -> None: - await message.reply('Выбери остановку', reply_markup=get_keyboard()) +async def echo(message: types.Message) -> SendMessage: + return SendMessage(message.chat.id, 'Выбери остановку', reply_markup=get_keyboard()) async def send_message(chat_ids: list[int]) -> None: @@ -87,45 +77,3 @@ async def send_message(chat_ids: list[int]) -> None: await asyncio.gather( *[bot.send_message(chat_id=chat_id, text=text, parse_mode=types.ParseMode.HTML) for chat_id in chat_ids] ) - - -def asyncio_schedule() -> None: - from apscheduler.schedulers.asyncio import AsyncIOScheduler - - scheduler = AsyncIOScheduler() - for cron in cron_jobs: - scheduler.add_job(send_message, kwargs=user_chat_ids, **cron) - scheduler.start() - - -async def on_startup(dispatcher) -> None: - await bot.set_webhook(WEBHOOK_URL) - asyncio_schedule() - - -async def on_shutdown(dispatcher): - logger.warning('Shutting down..') - - # Remove webhook (not acceptable in some cases) - await bot.delete_webhook() - - # Close DB connection (if used) - await dispatcher.storage.close() - await dispatcher.storage.wait_closed() - - logger.warning('Bye!') - - -if __name__ == '__main__': - download_gecko_driver() - driver = configure_firefox_driver() - - start_webhook( - dispatcher=dispatcher, - webhook_path=WEBHOOK_PATH, - on_startup=on_startup, - on_shutdown=on_shutdown, - skip_updates=True, - host=WEBAPP_HOST, - port=WEBAPP_PORT, - ) diff --git a/app/core/logger.py b/app/core/logger.py new file mode 100644 index 0000000..a3d755d --- /dev/null +++ b/app/core/logger.py @@ -0,0 +1,7 @@ +import sys +from loguru import logger + +logger.remove() +logger.add(sink=sys.stdout, colorize=True, level='DEBUG', + format="{time:DD.MM.YYYY HH:mm:ss} | {level} | " + "{message}") diff --git a/mos_gor.py b/app/core/parse_web.py similarity index 90% rename from mos_gor.py rename to app/core/parse_web.py index dbc7742..26d42d1 100644 --- a/mos_gor.py +++ b/app/core/parse_web.py @@ -1,25 +1,18 @@ import os -import sys import tarfile import time -from datetime import datetime from pathlib import Path import wget -from loguru import logger from selenium import webdriver from selenium.common.exceptions import NoSuchElementException from selenium.webdriver.firefox import options from selenium.webdriver.firefox.service import Service from selenium.webdriver.firefox.webdriver import WebDriver +from core.logger import logger from settings import BASE_DIR, GECKO_DRIVER_VERSION -logger.remove() -logger.add(sink=sys.stdout, colorize=True, level='DEBUG', - format="{time:DD.MM.YYYY HH:mm:ss} | {level} | " - "{message}") - def download_gecko_driver(): gecko_driver = f'https://github.com/mozilla/geckodriver/releases/download/v{GECKO_DRIVER_VERSION}/' \ diff --git a/app/core/scheduler.py b/app/core/scheduler.py new file mode 100644 index 0000000..13fba34 --- /dev/null +++ b/app/core/scheduler.py @@ -0,0 +1,20 @@ +from core.bot import send_message + +cron_jobs = [ + {'trigger': 'cron', 'day_of_week': 'mon-fri', 'hour': 8, 'minute': 59, 'second': 0}, + {'trigger': 'cron', 'day_of_week': 'mon-fri', 'hour': 9, 'minute': 4, 'second': 0}, + {'trigger': 'cron', 'day_of_week': 'mon-fri', 'hour': 9, 'minute': 9, 'second': 0}, + ] + +user_chat_ids = {'chat_ids': [417070387, # me + 431571617, # Lenok + ]} + + +def asyncio_schedule() -> None: + from apscheduler.schedulers.asyncio import AsyncIOScheduler + + scheduler = AsyncIOScheduler() + for cron in cron_jobs: + scheduler.add_job(send_message, kwargs=user_chat_ids, **cron) + scheduler.start() diff --git a/app/main.py b/app/main.py new file mode 100644 index 0000000..201190a --- /dev/null +++ b/app/main.py @@ -0,0 +1,39 @@ +from aiogram.utils.executor import start_webhook + +from core.bot import bot, dispatcher +from core.logger import logger +from core.parse_web import download_gecko_driver +from core.scheduler import asyncio_schedule +from settings import WEBHOOK_URL, WEBHOOK_PATH, WEBAPP_HOST, WEBAPP_PORT + + +async def on_startup(dispatcher) -> None: + await bot.set_webhook(WEBHOOK_URL) + asyncio_schedule() + + +async def on_shutdown(dispatcher): + logger.warning('Shutting down..') + + # Remove webhook (not acceptable in some cases) + await bot.delete_webhook() + + # Close DB connection (if used) + await dispatcher.storage.close() + await dispatcher.storage.wait_closed() + + logger.warning('Bye!') + + +if __name__ == '__main__': + download_gecko_driver() + + start_webhook( + dispatcher=dispatcher, + webhook_path=WEBHOOK_PATH, + on_startup=on_startup, + on_shutdown=on_shutdown, + skip_updates=True, + host=WEBAPP_HOST, + port=WEBAPP_PORT, + ) diff --git a/settings.py b/app/settings.py similarity index 94% rename from settings.py rename to app/settings.py index 8af3ca7..6b4062d 100644 --- a/settings.py +++ b/app/settings.py @@ -4,7 +4,7 @@ from decouple import AutoConfig # Build paths inside the project like this: BASE_DIR.joinpath('some') # `pathlib` is better than writing: dirname(dirname(dirname(__file__))) -BASE_DIR = Path(__file__).parent +BASE_DIR = Path(__file__).parent.parent # Loading `.env` files # See docs: https://gitlab.com/mkleehammer/autoconfig diff --git a/gunicorn.sh b/gunicorn.sh deleted file mode 100644 index 1feaa4c..0000000 --- a/gunicorn.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env sh - -set -o errexit -set -o nounset - -# We are using `gunicorn` for production, see: -# http://docs.gunicorn.org/en/stable/configure.html - -# Check that $DJANGO_ENV is set to "production", -# fail otherwise, since it may break things: - - -# Start gunicorn: -# Docs: http://docs.gunicorn.org/en/stable/settings.html -# Concerning `workers` setting see: -# https://github.com/wemake-services/wemake-django-template/issues/1022 -/usr/local/bin/gunicorn server.wsgi \ - --workers 9 \ - --timeout 150 \ - --max-requests 2000 \ - --max-requests-jitter 400 \ - --bind '0.0.0.0:8000' \ - --chdir '/opt/telebot_balsh/telebot' \ - --log-level info \ - --error-logfile "$SHARED_DIR/logs/gunicorn.log" \ - --worker-tmp-dir '/dev/shm' \ - --pid "$SHARED_DIR/logs/gunicorn_pid" diff --git a/scripts/start-bot.sh b/scripts/start-bot.sh index 680a0d6..e2df6cb 100644 --- a/scripts/start-bot.sh +++ b/scripts/start-bot.sh @@ -2,6 +2,6 @@ echo "starting the bot" -cd /opt/mosgortrans \ +cd /opt/mosgortrans/app \ && source /home/balsh/.cache/pypoetry/virtualenvs/mosgortrans-3eZxMcY3-py3.10/bin/activate \ && python main.py \ No newline at end of file