Added room operations (not tested)
This commit is contained in:
@@ -23,7 +23,7 @@ install the latest version of the library:
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
apt install libmagic1-dev libolm-dev
|
apt install libmagic1-dev libolm-dev
|
||||||
python -m pip install git+https://git.tyukalov.su/nikita/mab@v0.6.0
|
python -m pip install git+https://git.tyukalov.su/nikita/mab@v0.6.1
|
||||||
```
|
```
|
||||||
|
|
||||||
`libmagic1-dev` is needed for automatic file MIME type detection, `libolm-dev`
|
`libmagic1-dev` is needed for automatic file MIME type detection, `libolm-dev`
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|||||||
|
|
||||||
[project]
|
[project]
|
||||||
name = "mab"
|
name = "mab"
|
||||||
version = "0.6.0"
|
version = "0.6.1"
|
||||||
authors = [
|
authors = [
|
||||||
{ name = "Tyukalov Nikita", email = "nikita@tyukalov.su" }
|
{ name = "Tyukalov Nikita", email = "nikita@tyukalov.su" }
|
||||||
]
|
]
|
||||||
|
|||||||
147
src/mab/bot/_client_room_operations.py
Normal file
147
src/mab/bot/_client_room_operations.py
Normal file
@@ -0,0 +1,147 @@
|
|||||||
|
import logging
|
||||||
|
from nio import (
|
||||||
|
AsyncClient,
|
||||||
|
Event,
|
||||||
|
MatrixRoom,
|
||||||
|
MatrixUser,
|
||||||
|
RoomMember,
|
||||||
|
|
||||||
|
RoomGetEventResponse,
|
||||||
|
RoomLeaveResponse,
|
||||||
|
JoinResponse,
|
||||||
|
RoomInviteResponse,
|
||||||
|
RoomKickResponse,
|
||||||
|
RoomBanResponse,
|
||||||
|
RoomUnbanResponse,
|
||||||
|
JoinedMembersResponse
|
||||||
|
)
|
||||||
|
from ..utils import MatrixBotConfig
|
||||||
|
|
||||||
|
class ClientRoomOperations:
|
||||||
|
"""This class works with rooms."""
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _room_id(room: MatrixRoom | str) -> str:
|
||||||
|
"""Convert room to its ID if needed"""
|
||||||
|
return room.room_id if isinstance(room, MatrixRoom) else room
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _user_id(user: MatrixUser | str) -> str:
|
||||||
|
"""Convert user to its ID if needed"""
|
||||||
|
return user.user_id if isinstance(user, MatrixUser) else user
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self._logger = logging.getLogger("ClientRoomOperations")
|
||||||
|
self._config: MatrixBotConfig | None = None
|
||||||
|
self._client: AsyncClient | None = None
|
||||||
|
|
||||||
|
async def setup(self,
|
||||||
|
config: MatrixBotConfig,
|
||||||
|
client: AsyncClient) -> None:
|
||||||
|
"""Setup room operations.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
- config - config to use
|
||||||
|
- client - client to use
|
||||||
|
"""
|
||||||
|
self._config = config
|
||||||
|
self._client = client
|
||||||
|
|
||||||
|
async def event(self, room: MatrixRoom | str, event_id: str) -> Event:
|
||||||
|
"""Get raw event information from matrix server (no cache used yet).
|
||||||
|
|
||||||
|
Args:
|
||||||
|
- room - room where the event happened
|
||||||
|
- event_id - ID of the event
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
- `nio.Event` on success
|
||||||
|
- raises an exception on matrix error
|
||||||
|
"""
|
||||||
|
if self._config is None or self._client is None:
|
||||||
|
raise RuntimeError("ClientRoom is not set up")
|
||||||
|
res = await self._client.room_get_event(
|
||||||
|
self._room_id(room),
|
||||||
|
event_id
|
||||||
|
)
|
||||||
|
if isinstance(res, RoomGetEventResponse):
|
||||||
|
return res.event
|
||||||
|
else:
|
||||||
|
raise RuntimeError(res)
|
||||||
|
|
||||||
|
async def leave(self, room: MatrixRoom | str) -> None:
|
||||||
|
"""Leave the room (or reject the invite)."""
|
||||||
|
if self._config is None or self._client is None:
|
||||||
|
raise RuntimeError("ClientRoom is not set up")
|
||||||
|
res = await self._client.room_leave(self._room_id(room))
|
||||||
|
if not isinstance(res, RoomLeaveResponse):
|
||||||
|
raise RuntimeError(res)
|
||||||
|
|
||||||
|
async def join(self, room: MatrixRoom | str) -> None:
|
||||||
|
"""Join the room."""
|
||||||
|
if self._config is None or self._client is None:
|
||||||
|
raise RuntimeError("ClientRoom is not set up")
|
||||||
|
res = await self._client.join(
|
||||||
|
self._room_id(room)
|
||||||
|
)
|
||||||
|
if not isinstance(res, JoinResponse):
|
||||||
|
raise RuntimeError(res)
|
||||||
|
|
||||||
|
async def invite(self, room: MatrixRoom | str, user: MatrixUser | str) -> None:
|
||||||
|
"""Invite the user to the room."""
|
||||||
|
if self._config is None or self._client is None:
|
||||||
|
raise RuntimeError("ClientRoom is not set up")
|
||||||
|
res = await self._client.room_invite(
|
||||||
|
self._room_id(room),
|
||||||
|
self._user_id(user)
|
||||||
|
)
|
||||||
|
if not isinstance(res, RoomInviteResponse):
|
||||||
|
raise RuntimeError(res)
|
||||||
|
|
||||||
|
async def kick(self, room: MatrixRoom | str, user: MatrixUser | str, reason: str | None = None) -> None:
|
||||||
|
"""Kick the user from the room. The user will be able to join the room
|
||||||
|
again.
|
||||||
|
"""
|
||||||
|
if self._config is None or self._client is None:
|
||||||
|
raise RuntimeError("ClientRoom is not set up")
|
||||||
|
res = await self._client.room_kick(
|
||||||
|
self._room_id(room),
|
||||||
|
self._user_id(user),
|
||||||
|
reason
|
||||||
|
)
|
||||||
|
if not isinstance(res, RoomKickResponse):
|
||||||
|
raise RuntimeError(res)
|
||||||
|
|
||||||
|
async def ban(self, room: MatrixRoom | str, user: MatrixUser | str, reason: str | None = None) -> None:
|
||||||
|
"""Ban the user from the room. The user will be unable to join until he
|
||||||
|
is unbanned.
|
||||||
|
"""
|
||||||
|
if self._config is None or self._client is None:
|
||||||
|
raise RuntimeError("ClientRoom is not set up")
|
||||||
|
res = await self._client.room_ban(
|
||||||
|
self._room_id(room),
|
||||||
|
self._user_id(user),
|
||||||
|
reason
|
||||||
|
)
|
||||||
|
if not isinstance(res, RoomBanResponse):
|
||||||
|
raise RuntimeError(res)
|
||||||
|
|
||||||
|
async def unban(self, room: MatrixRoom | str, user: MatrixUser | str) -> None:
|
||||||
|
"""Unban the user from the room."""
|
||||||
|
if self._config is None or self._client is None:
|
||||||
|
raise RuntimeError("ClientRoom is not set up")
|
||||||
|
res = await self._client.room_unban(
|
||||||
|
self._room_id(room),
|
||||||
|
self._user_id(user)
|
||||||
|
)
|
||||||
|
if not isinstance(res, RoomUnbanResponse):
|
||||||
|
raise RuntimeError(res)
|
||||||
|
|
||||||
|
async def members(self, room: MatrixRoom | str) -> list[RoomMember]:
|
||||||
|
"""Get list of room members."""
|
||||||
|
if self._config is None or self._client is None:
|
||||||
|
raise RuntimeError("ClientRoom is not set up")
|
||||||
|
res = await self._client.joined_members(self._room_id(room))
|
||||||
|
if not isinstance(res, JoinedMembersResponse):
|
||||||
|
raise RuntimeError(res)
|
||||||
|
return res.members
|
||||||
@@ -12,6 +12,7 @@ from ..context import EventContext
|
|||||||
from ._validation import Validator
|
from ._validation import Validator
|
||||||
from ._storage import Storage
|
from ._storage import Storage
|
||||||
from ._client_auth import ClientAuth
|
from ._client_auth import ClientAuth
|
||||||
|
from ._client_room_operations import ClientRoomOperations
|
||||||
from ._client_downloader import ClientDownloader
|
from ._client_downloader import ClientDownloader
|
||||||
from ._client_manager import ClientManager
|
from ._client_manager import ClientManager
|
||||||
from ._client_uploader import ClientUploader
|
from ._client_uploader import ClientUploader
|
||||||
@@ -35,6 +36,7 @@ class MatrixBot:
|
|||||||
self._client_manager = ClientManager(self._client_auth, self._storage)
|
self._client_manager = ClientManager(self._client_auth, self._storage)
|
||||||
self._client_uploader = ClientUploader(self._storage)
|
self._client_uploader = ClientUploader(self._storage)
|
||||||
self._client_downloader = ClientDownloader()
|
self._client_downloader = ClientDownloader()
|
||||||
|
self._client_room_operations = ClientRoomOperations()
|
||||||
self._client_sender = ClientSender()
|
self._client_sender = ClientSender()
|
||||||
self._callbacks = Callbacks(self._storage, self)
|
self._callbacks = Callbacks(self._storage, self)
|
||||||
# validate the config and save it
|
# validate the config and save it
|
||||||
@@ -86,6 +88,10 @@ class MatrixBot:
|
|||||||
self._config,
|
self._config,
|
||||||
self._client_manager.get_client()
|
self._client_manager.get_client()
|
||||||
)
|
)
|
||||||
|
await self._client_room_operations.setup(
|
||||||
|
self._config,
|
||||||
|
self._client_manager.get_client()
|
||||||
|
)
|
||||||
await self._client_sender.setup(
|
await self._client_sender.setup(
|
||||||
self._config,
|
self._config,
|
||||||
self._client_manager.get_client(),
|
self._client_manager.get_client(),
|
||||||
@@ -138,4 +144,11 @@ class MatrixBot:
|
|||||||
@property
|
@property
|
||||||
def download(self) -> ClientDownloader:
|
def download(self) -> ClientDownloader:
|
||||||
"""Get ClientDownloader that you should use to download files."""
|
"""Get ClientDownloader that you should use to download files."""
|
||||||
return self._client_downloader
|
return self._client_downloader
|
||||||
|
|
||||||
|
@property
|
||||||
|
def rooms(self) -> ClientRoomOperations:
|
||||||
|
"""Get ClientRoomOperations that you should use to do room-related
|
||||||
|
actions.
|
||||||
|
"""
|
||||||
|
return self._client_room_operations
|
||||||
Reference in New Issue
Block a user