Browse Source

Рефакторинг. Вынес настройки в отдельный модуль

master
Дмитрий 3 years ago
parent
commit
5c05f6c84c
  1. 80
      main.py
  2. 41
      services.py
  3. 14
      settings.py

80
main.py

@ -1,4 +1,3 @@
import os
import logging import logging
from aiogram import Bot, Dispatcher, executor, types from aiogram import Bot, Dispatcher, executor, types
from aiogram.utils.exceptions import MessageToDeleteNotFound from aiogram.utils.exceptions import MessageToDeleteNotFound
@ -10,63 +9,20 @@ from sqlalchemy.orm import sessionmaker
from sqlalchemy.exc import IntegrityError from sqlalchemy.exc import IntegrityError
from models import Allowed_user, Token, Messages_to_delete, Base from models import Allowed_user, Token, Messages_to_delete, Base
from aiogram.utils.markdown import escape_md from aiogram.utils.markdown import escape_md
from services import auth, only_admins
from . import settings
logging.basicConfig(level=logging.INFO) 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") bot = Bot(token=settings.API_TOKEN)
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)
dp = Dispatcher(bot) dp = Dispatcher(bot)
engine = create_engine("sqlite:///" + str(DB_PATH)) engine = create_engine("sqlite:///" + str(settings.DB_PATH))
Session = sessionmaker(bind=engine) Session = sessionmaker(bind=engine)
session = Session() 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): async def clean_up(message_id: int, delay_min: int):
exp = datetime.now() + timedelta(minutes=delay_min) exp = datetime.now() + timedelta(minutes=delay_min)
msg: Messages_to_delete = Messages_to_delete( 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) await asyncio.sleep(delay_min * 60)
try: 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.delete(msg)
session.commit() session.commit()
except MessageToDeleteNotFound: except MessageToDeleteNotFound:
@ -98,8 +54,6 @@ async def send_welcome(message: types.Message):
@only_admins @only_admins
async def get_channel_id(message: types.Message) -> None: async def get_channel_id(message: types.Message) -> None:
"""Возвращает id канала по его имени.""" """Возвращает id канала по его имени."""
if message["from"]["id"] not in ADMINS:
return
c_id = message.text[12:] c_id = message.text[12:]
@ -118,16 +72,16 @@ async def get_channel_id(message: types.Message) -> None:
@auth @auth
async def send_to_chanel(message: types.Message) -> None: 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}*" out_text = f"{message.text[5:]} \n\nБудет удалено в *{deletion_time}*"
result = await bot.send_message( result = await bot.send_message(
chat_id=CHAT_ID, chat_id=settings.CHAT_ID,
text=out_text, text=out_text,
disable_notification=True, disable_notification=True,
parse_mode="Markdown", parse_mode="Markdown",
) )
print(result.sender_chat.id) 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"]) @dp.message_handler(commands=["q"])
@ -149,16 +103,16 @@ async def send_question(message: types.Message) -> None:
) )
return 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}*" out_text = f"*Внимание, вопрос!*\n\n{message.text[3:]}\n\nБудет удалено в *{deletion_time}*"
result = await bot.send_message( result = await bot.send_message(
chat_id=CHAT_ID, chat_id=settings.CHAT_ID,
text=out_text, text=out_text,
disable_notification=True, disable_notification=True,
parse_mode="Markdown", 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"]) @dp.message_handler(commands=["get_invite"])
@ -212,7 +166,7 @@ async def add_me(message: types.Message) -> None:
# генерируем ссылку, истечет через 5 минут, может вступить 1 человек # генерируем ссылку, истечет через 5 минут, может вступить 1 человек
link = await bot.create_chat_invite_link( 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( 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() session.query(Allowed_user).filter(Allowed_user.user_id == u_id).one_or_none()
) )
await bot.kick_chat_member( 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.delete(finded_user)
session.commit() session.commit()
@ -271,7 +225,9 @@ async def messages_cleanup() -> None:
for m in msg_list: for m in msg_list:
if m.deletion_needed: if m.deletion_needed:
try: 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.delete(m)
session.commit() session.commit()
except MessageToDeleteNotFound: except MessageToDeleteNotFound:

41
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

14
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")
Loading…
Cancel
Save