From 5c05f6c84c855be78a050ed49f398a8881d4ad9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Fri, 25 Mar 2022 18:15:34 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D0=B8=D0=BD=D0=B3.=20=D0=92=D1=8B=D0=BD=D0=B5=D1=81=20?= =?UTF-8?q?=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B9=D0=BA=D0=B8=20=D0=B2?= =?UTF-8?q?=20=D0=BE=D1=82=D0=B4=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9=20?= =?UTF-8?q?=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 80 ++++++++++++----------------------------------------- services.py | 41 +++++++++++++++++++++++++++ settings.py | 14 ++++++++++ 3 files changed, 73 insertions(+), 62 deletions(-) create mode 100644 services.py create mode 100644 settings.py diff --git a/main.py b/main.py index 82cc6db..8f039d4 100644 --- a/main.py +++ b/main.py @@ -1,4 +1,3 @@ -import os import logging from aiogram import Bot, Dispatcher, executor, types from aiogram.utils.exceptions import MessageToDeleteNotFound @@ -10,63 +9,20 @@ from sqlalchemy.orm import sessionmaker from sqlalchemy.exc import IntegrityError from models import Allowed_user, Token, Messages_to_delete, Base from aiogram.utils.markdown import escape_md - +from services import auth, only_admins +from . import settings logging.basicConfig(level=logging.INFO) -DELAY_TIME = int(os.getenv("GBOT_DELAY_TIME")) -DELAY_TIME_Q = int(os.getenv("GBOT_DELAY_TIME_Q")) -CHAT_ID = os.getenv("GBOT_CHAT_ID") -ALLOWED_USERS = [106693654, 7063133] -ADMINS = [106693654, 7063133, 4978608] -API_TOKEN = os.getenv("TELEGRAM_API_TOKEN") -DB_PATH = os.getenv("GBOT_DB_PATH") -bot = Bot(token=API_TOKEN) + + +bot = Bot(token=settings.API_TOKEN) dp = Dispatcher(bot) -engine = create_engine("sqlite:///" + str(DB_PATH)) +engine = create_engine("sqlite:///" + str(settings.DB_PATH)) Session = sessionmaker(bind=engine) session = Session() -def auth(func): - """Аутентификация. - - Проверяем, что у юзера есть полномочия на выполнение действия - он - должен быть в белом списке. - - """ - - async def wrapper(message): - finded_user: Allowed_user - uid = message["from"]["id"] - - finded_user = ( - session.query(Allowed_user) - .filter(Allowed_user.user_id == uid) - .one_or_none() - ) - - if not finded_user: - return - return await func(message) - - return wrapper - - -def only_admins(func): - """Действия только для админов.""" - - async def wrapper(message): - uid = message["from"]["id"] - - if uid not in ADMINS: - return - - return await func(message) - - return wrapper - - async def clean_up(message_id: int, delay_min: int): exp = datetime.now() + timedelta(minutes=delay_min) msg: Messages_to_delete = Messages_to_delete( @@ -77,7 +33,7 @@ async def clean_up(message_id: int, delay_min: int): await asyncio.sleep(delay_min * 60) try: - await bot.delete_message(chat_id=CHAT_ID, message_id=message_id) + await bot.delete_message(chat_id=settings.CHAT_ID, message_id=message_id) session.delete(msg) session.commit() except MessageToDeleteNotFound: @@ -98,8 +54,6 @@ async def send_welcome(message: types.Message): @only_admins async def get_channel_id(message: types.Message) -> None: """Возвращает id канала по его имени.""" - if message["from"]["id"] not in ADMINS: - return c_id = message.text[12:] @@ -118,16 +72,16 @@ async def get_channel_id(message: types.Message) -> None: @auth async def send_to_chanel(message: types.Message) -> None: - deletion_time = message.date + timedelta(minutes=DELAY_TIME) + deletion_time = message.date + timedelta(minutes=settings.DELAY_TIME) out_text = f"{message.text[5:]} \n\nБудет удалено в *{deletion_time}*" result = await bot.send_message( - chat_id=CHAT_ID, + chat_id=settings.CHAT_ID, text=out_text, disable_notification=True, parse_mode="Markdown", ) print(result.sender_chat.id) - await clean_up(message_id=result.message_id, delay_min=DELAY_TIME) + await clean_up(message_id=result.message_id, delay_min=settings.DELAY_TIME) @dp.message_handler(commands=["q"]) @@ -149,16 +103,16 @@ async def send_question(message: types.Message) -> None: ) return - deletion_time = message.date + timedelta(minutes=DELAY_TIME_Q) + deletion_time = message.date + timedelta(minutes=settings.DELAY_TIME_Q) out_text = f"*Внимание, вопрос!*\n\n{message.text[3:]}\n\nБудет удалено в *{deletion_time}*" result = await bot.send_message( - chat_id=CHAT_ID, + chat_id=settings.CHAT_ID, text=out_text, disable_notification=True, parse_mode="Markdown", ) - await clean_up(message_id=result.message_id, delay_min=DELAY_TIME_Q) + await clean_up(message_id=result.message_id, delay_min=settings.DELAY_TIME_Q) @dp.message_handler(commands=["get_invite"]) @@ -212,7 +166,7 @@ async def add_me(message: types.Message) -> None: # генерируем ссылку, истечет через 5 минут, может вступить 1 человек link = await bot.create_chat_invite_link( - chat_id=CHAT_ID, expire_date=timedelta(minutes=5), member_limit=1 + chat_id=settings.CHAT_ID, expire_date=timedelta(minutes=5), member_limit=1 ) await message.reply( @@ -243,7 +197,7 @@ async def stop_and_panic(message: types.Message) -> None: session.query(Allowed_user).filter(Allowed_user.user_id == u_id).one_or_none() ) await bot.kick_chat_member( - chat_id=CHAT_ID, user_id=finded_user.user_id, revoke_messages=True + chat_id=settings.CHAT_ID, user_id=finded_user.user_id, revoke_messages=True ) session.delete(finded_user) session.commit() @@ -271,7 +225,9 @@ async def messages_cleanup() -> None: for m in msg_list: if m.deletion_needed: try: - await bot.delete_message(chat_id=CHAT_ID, message_id=m.message_id) + await bot.delete_message( + chat_id=settings.CHAT_ID, message_id=m.message_id + ) session.delete(m) session.commit() except MessageToDeleteNotFound: diff --git a/services.py b/services.py new file mode 100644 index 0000000..589d611 --- /dev/null +++ b/services.py @@ -0,0 +1,41 @@ +"""Славный модуль с бизнес-логикой.""" +from models import Allowed_user + + +def auth(func): + """Аутентификация. + + Проверяем, что у юзера есть полномочия на выполнение действия - он + должен быть в белом списке. + + """ + + async def wrapper(message): + finded_user: Allowed_user + uid = message["from"]["id"] + + finded_user = ( + session.query(Allowed_user) + .filter(Allowed_user.user_id == uid) + .one_or_none() + ) + + if not finded_user: + return + return await func(message) + + return wrapper + + +def only_admins(func): + """Действия только для админов.""" + + async def wrapper(message): + uid = message["from"]["id"] + + if uid not in ADMINS: + return + + return await func(message) + + return wrapper diff --git a/settings.py b/settings.py new file mode 100644 index 0000000..d5ba6c1 --- /dev/null +++ b/settings.py @@ -0,0 +1,14 @@ +"""Модуль для хранения настроек приложения. + +Естественно все чувствительные данные храняться в переменных +окружения. + +""" +from os import getenv + +DELAY_TIME = int(getenv("GBOT_DELAY_TIME")) +DELAY_TIME_Q = int(getenv("GBOT_DELAY_TIME_Q")) +CHAT_ID = getenv("GBOT_CHAT_ID") +ADMINS = [106693654, 7063133, 4978608] +API_TOKEN = getenv("TELEGRAM_API_TOKEN") +DB_PATH = getenv("GBOT_DB_PATH")