from typing import Any, Dict, Optional, Union from asgiref.sync import async_to_sync from nio import AsyncClient, RoomCreateError, RoomCreateResponse, RoomKickResponse, RoomInviteError,\ RoomInviteResponse, RoomPreset, RoomResolveAliasResponse, RoomVisibility class Matrix: @classmethod async def _get_client(cls) -> AsyncClient: # TODO Store client = AsyncClient("https://correspondances-maths.fr", "@corres2mathbot:correspondances-maths.fr") await client.login("toto1234") return client @classmethod @async_to_sync async def create_room( cls, visibility: RoomVisibility = RoomVisibility.private, alias: Optional[str] = None, name: Optional[str] = None, topic: Optional[str] = None, room_version: Optional[str] = None, federate: bool = True, is_direct: bool = False, preset: Optional[RoomPreset] = None, invite=(), initial_state=(), power_level_override: Optional[Dict[str, Any]] = None, ) -> Union[RoomCreateResponse, RoomCreateError]: resp: Union[RoomCreateResponse, RoomCreateError] client = await cls._get_client() return await client.room_create( visibility, alias, name, topic, room_version, federate, is_direct, preset, invite, initial_state, power_level_override) @classmethod async def resolve_room_alias(cls, room_alias: str) -> str: client = await cls._get_client() resp: RoomResolveAliasResponse = await client.room_resolve_alias(room_alias) return resp.room_id @classmethod @async_to_sync async def invite(cls, room_id: str, user_id: str) -> Union[RoomInviteResponse, RoomInviteError]: client = await cls._get_client() if room_id.startswith("#"): room_id = await cls.resolve_room_alias(room_id) return await client.room_invite(room_id, user_id)