import asyncio import logging import signal from aiohttp import ClientSession from handlers.command_my import send_message 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 bot.config import BOT_TOKEN, FEEDBACK_CHAT_ID from bot.state import State from storage import Profile logger = logging.getLogger(__name__) logging.basicConfig(level=logging.INFO) state = State() api_url = f'https://api.telegram.org/bot{BOT_TOKEN}/' async def fetch(session, url): async with session.get(url) as response: return await response.json() async def command_start_handler(message): caption = "Напишите своё сообщение для нас" if message.from_user.llanguage_code == 'ru' else "Write your message for us" await message.answer(caption) async def process_callback(cbq): try: data = cbq.get("data") if data.startswith("vouch"): await handle_button(cbq) elif data.startswith("unlink"): await handle_unlink(cbq, state) except Exception as e: logger.error(f"[main.process_callback] ERROR {e}") logger.debug(cbq) import traceback text = traceback.format_exc() await send_message(FEEDBACK_CHAT_ID, text) async def join_request_handler(join_request): try: await handle_join_request(join_request) except Exception as e: logger.error(f"[main.join_request_handler] ERROR {e}") logger.debug(join_request) import traceback text = traceback.format_exc() await send_message(FEEDBACK_CHAT_ID, text) async def all_handler(message): try: await handle_routing(message, state) except Exception as e: logger.error(f"[main.all_handler] ERROR {e}") logger.debug(message) import traceback text = traceback.format_exc() await send_message(FEEDBACK_CHAT_ID, text) async def chat_members_change(update): try: old = update.get("old_chat_member") if old: if old.get("status") == 'KICKED': Profile.erase(update["from"]["id"]) await handle_left(update) elif update.get("new_chat_member"): await handle_join(update) else: logger.info("unhandled members update") except Exception as e: logger.error(f"[main.my_chat_member] ERROR {e}") logger.debug(update) import traceback text = traceback.format_exc() await send_message(FEEDBACK_CHAT_ID, text) async def main(): # storage revalidation await handle_startup() async with ClientSession() as session: offset = 0 # начальное значение offset while True: updates = await fetch(session, f"{api_url}getUpdates?offset={offset}") for update in updates["result"]: if "message" in update: await all_handler(update["message"]) elif "callback_query" in update: await process_callback(update["callback_query"]) elif "join_chat_request" in update: await join_request_handler(update["join_chat_request"]) elif "my_chat_member" in update: await chat_members_change(update["my_chat_member"]) offset = update["update_id"] + 1 # обновление offset await asyncio.sleep(1.0) if __name__ == "__main__": logging.basicConfig(level=logging.INFO, stream=sys.stdout) # Запуск асинхронного цикла asyncio.run(main())