52 lines
1.7 KiB
Python
52 lines
1.7 KiB
Python
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) |