Added create_room action

This commit is contained in:
Fabio Manganiello 2022-08-27 23:26:42 +02:00
parent 912168626c
commit d890b6cbe8
Signed by: blacklight
GPG key ID: D90FBA7F76362774
2 changed files with 72 additions and 2 deletions

View file

@ -8,7 +8,7 @@ import re
import threading import threading
from dataclasses import dataclass from dataclasses import dataclass
from typing import Collection, Coroutine, Dict from typing import Collection, Coroutine, Dict, Sequence
from urllib.parse import urlparse from urllib.parse import urlparse
from async_lru import alru_cache from async_lru import alru_cache
@ -58,6 +58,7 @@ from nio import (
import aiofiles import aiofiles
import aiofiles.os import aiofiles.os
from nio.api import RoomVisibility
from nio.client.async_client import client_session from nio.client.async_client import client_session
from nio.crypto import decrypt_attachment from nio.crypto import decrypt_attachment
@ -93,6 +94,7 @@ from platypush.schemas.matrix import (
MatrixEventIdSchema, MatrixEventIdSchema,
MatrixMyDeviceSchema, MatrixMyDeviceSchema,
MatrixProfileSchema, MatrixProfileSchema,
MatrixRoomIdSchema,
MatrixRoomSchema, MatrixRoomSchema,
) )
@ -1112,7 +1114,7 @@ class MatrixPlugin(AsyncRunnablePlugin):
if evt.get('type') == 'm.room.create': if evt.get('type') == 'm.room.create':
room_args['own_user_id'] = evt.get('content', {}).get('creator') room_args['own_user_id'] = evt.get('content', {}).get('creator')
elif evt.get('type') == 'm.room.encryption': elif evt.get('type') == 'm.room.encryption':
room_args['encrypted'] = False room_args['encrypted'] = True
elif evt.get('type') == 'm.room.name': elif evt.get('type') == 'm.room.name':
room_params['name'] = evt.get('content', {}).get('name') room_params['name'] = evt.get('content', {}).get('name')
elif evt.get('type') == 'm.room.topic': elif evt.get('type') == 'm.room.topic':
@ -1146,6 +1148,8 @@ class MatrixPlugin(AsyncRunnablePlugin):
def get_joined_rooms(self): def get_joined_rooms(self):
""" """
Retrieve the rooms that the user has joined. Retrieve the rooms that the user has joined.
:return: .. schema:: matrix.MatrixRoomSchema(many=True)
""" """
response = self._loop_execute(self.client.joined_rooms()) response = self._loop_execute(self.client.joined_rooms())
return [self.get_room(room_id).output for room_id in response.rooms] # type: ignore return [self.get_room(room_id).output for room_id in response.rooms] # type: ignore
@ -1281,6 +1285,62 @@ class MatrixPlugin(AsyncRunnablePlugin):
return rs[0].content_uri return rs[0].content_uri
@action
def create_room(
self,
name: str | None = None,
alias: str | None = None,
topic: str | None = None,
is_public: bool = False,
is_direct: bool = False,
federate: bool = True,
encrypted: bool = False,
invite_users: Sequence[str] = (),
):
"""
Create a new room on the server.
:param name: Room name.
:param alias: Custom alias for the canonical name. For example, if set
to ``foo``, the alias for this room will be
``#foo:matrix.example.org``.
:param topic: Room topic.
:param is_public: Set to True if you want the room to be public and
discoverable (default: False).
:param is_direct: Set to True if this should be considered a direct
room with only one user (default: False).
:param federate: Whether you want to allow users from other servers to
join the room (default: True).
:param encrypted: Whether the room should be encrypted (default: False).
:param invite_users: A list of user IDs to invite to the room.
:return: .. schema:: matrix.MatrixRoomIdSchema
"""
rs = self._loop_execute(
self.client.room_create(
name=name,
alias=alias,
topic=topic,
is_direct=is_direct,
federate=federate,
invite=invite_users,
visibility=(
RoomVisibility.public if is_public else RoomVisibility.private
),
initial_state=[
{
'type': 'm.room.encryption',
'content': {
'algorithm': 'm.megolm.v1.aes-sha2',
},
}
]
if encrypted
else (),
)
)
return MatrixRoomIdSchema().dump(rs)
@action @action
def invite_to_room(self, room_id: str, user_id: str): def invite_to_room(self, room_id: str, user_id: str):
""" """

View file

@ -14,6 +14,16 @@ class MatrixEventIdSchema(Schema):
) )
class MatrixRoomIdSchema(Schema):
room_id = fields.String(
required=True,
metadata={
'description': 'Room ID',
'example': '!aBcDeFgHiJkMnO:matrix.example.org',
},
)
class MatrixProfileSchema(Schema): class MatrixProfileSchema(Schema):
user_id = fields.String( user_id = fields.String(
required=True, required=True,