import asyncio import logging import sys import signal # Import the signal module from aiogram import Bot, Dispatcher, Router from aiogram.enums import ParseMode from aiogram.filters import CommandStart, Command from aiogram.types import Message, ChatJoinRequest, CallbackQuery, ChatMemberUpdated, ChatMemberLeft, ChatMemberBanned from aiogram.enums import ChatMemberStatus from config import BOT_TOKEN from handlers.routing import handle_routing from handlers.callback_unlink import handle_unlink from handlers.callback_vouch import handle_button from handlers.handle_join_request import handle_join_request from handlers.handle_startup import handle_startup from handlers.handle_members_change import handle_join, handle_left from state import State logger = logging.getLogger(__name__) logging.basicConfig(level=logging.INFO) router = Router() bot = Bot(BOT_TOKEN, parse_mode=ParseMode.HTML) dp = Dispatcher() state = State() @router.message(CommandStart()) async def command_start_handler(message: Message) -> None: await message.answer("Напишите своё сообщение для администрации чата") @router.callback_query() async def process_callback(callback_query: CallbackQuery): cbq = vars(callback_query) cbq["from"] = vars(callback_query.from_user) cbq["message"] = vars(callback_query.message) data = cbq["data"] if data.startswith("vouch"): await handle_button(cbq) elif data.startswith("unlink"): await handle_unlink(cbq, state) @router.chat_join_request() async def join_request_handler(update: ChatJoinRequest) -> None: print("chat join request") join_request = vars(update) join_request["from"] = vars(update.from_user) join_request["chat"] = vars(update.chat) await handle_join_request(join_request) @router.message() async def all_handler(message: Message) -> None: msg = vars(message) msg["from"] = vars(message.from_user) msg["chat"] = vars(message.chat) if message.reply_to_message: msg["reply_to_message"] = vars(message.reply_to_message) msg["reply_to_message"]["from"] = vars(message.reply_to_message.from_user) await handle_routing(msg, state) await asyncio.sleep(1.0) @router.my_chat_member() async def chat_members_change(update: ChatMemberUpdated): msg = vars(update) msg["chat"] = vars(update.chat) msg["from"] = vars(update.from_user) logger.debug(msg) if update.old_chat_member.status == ChatMemberStatus.KICKED: # был забанен, удаляем все поручения await handle_left(msg) else: await handle_join(msg) async def main() -> None: # connect router dp.include_router(router) # storage revalidation await handle_startup() # Start event dispatching await dp.start_polling(bot) if __name__ == "__main__": logging.basicConfig(level=logging.INFO, stream=sys.stdout) # Define a function to handle SIGTERM def handle_sigterm(signum, frame): logger.info("Received SIGTERM. Shutting down gracefully...") asyncio.get_event_loop().stop() # Register the SIGTERM signal handler signal.signal(signal.SIGTERM, handle_sigterm) asyncio.get_event_loop().run_until_complete(main())