|
|
|
@ -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: |
|
|
|
|