import asyncio import sys import traceback import login import callbacks from nio import ( RoomMessageText, InviteMemberEvent, MegolmEvent, KeyVerificationEvent ) async def main(): callbacks.client = await login.login_from_credentials() # Критично для E2EE: загружаем ключи бота на сервер, # чтобы другие устройства могли с ним общаться if callbacks.client.should_upload_keys: await callbacks.client.keys_upload() print("[INFO] Ключи E2EE загружены на сервер.") # Регистрируем обработчики callbacks.client.add_event_callback(callbacks.message_callback, RoomMessageText) callbacks.client.add_event_callback(callbacks.megolm_callback, MegolmEvent) callbacks.client.add_event_callback(callbacks.invite_callback, InviteMemberEvent) callbacks.client.add_to_device_callback(callbacks.to_device_callback, KeyVerificationEvent) print("[INFO] Эхо-бот запущен. Для выхода нажмите Ctrl+C.") after_sync_task = asyncio.ensure_future(callbacks.after_first_sync()) sync_task = asyncio.ensure_future( callbacks.client.sync_forever(timeout=30000, full_state=True) ) try: await asyncio.gather(after_sync_task, sync_task) except asyncio.CancelledError: pass finally: await callbacks.client.close() print("[INFO] Клиент закрыт.") if __name__ == "__main__": try: asyncio.run(main()) except KeyboardInterrupt: print("\n[INFO] Остановка бота.") except Exception: print(traceback.format_exc()) sys.exit(1)