diff --git a/menuflow/example-config.yaml b/menuflow/example-config.yaml index e565196..b9b3a2c 100644 --- a/menuflow/example-config.yaml +++ b/menuflow/example-config.yaml @@ -8,7 +8,7 @@ menuflow: # You can use of the fields defined in RoomEventFilter, for more information: # https://github.com/mautrix/python/blob/master/mautrix/types/filter.py#L57 room_event_filter: - limit: 5 + limit: 0 lazy_load_members: true # Ignore messages or invitations from this users, it accepts user_ids and regex diff --git a/menuflow/menu.py b/menuflow/menu.py index 537c7e1..52c0710 100644 --- a/menuflow/menu.py +++ b/menuflow/menu.py @@ -171,23 +171,22 @@ async def _start(self, try_n: int | None = 0) -> None: self.enabled = False await self.update() return - if not self.filter_id: - self.filter_id = await self.matrix_handler.create_filter( - Filter( - room=RoomFilter( - timeline=RoomEventFilter( - **self.menuflow.config["menuflow.sync.room_event_filter"] - ), - state=StateFilter( - lazy_load_members=True, - ), + self.filter_id = await self.matrix_handler.create_filter( + Filter( + room=RoomFilter( + timeline=RoomEventFilter( + **self.menuflow.config["menuflow.sync.room_event_filter"] ), - presence=EventFilter( - not_types=[EventType.PRESENCE], + state=StateFilter( + lazy_load_members=True, ), - ) + ), + presence=EventFilter( + not_types=[EventType.PRESENCE], + ), ) - await self.update() + ) + await self.update() # if self.crypto: # await self._start_crypto() self.start_sync() diff --git a/menuflow/nodes/invite_user.py b/menuflow/nodes/invite_user.py index f1bb658..5b0bc6c 100644 --- a/menuflow/nodes/invite_user.py +++ b/menuflow/nodes/invite_user.py @@ -2,10 +2,11 @@ from datetime import datetime from typing import Dict -from menuflow.room import Room +import mautrix.errors.request from ..db.room import RoomState from ..repository import InviteUser as InviteUserModel +from ..room import Room from .switch import Switch @@ -31,7 +32,13 @@ async def _update_menu(self, case_id: str): async def run(self): # Invite users to a room. - await self.room.matrix_client.invite_user(self.room.room_id, self.invitee) + try: + await self.room.matrix_client.invite_user(self.room.room_id, self.invitee) + except mautrix.errors.request.MForbidden as e: + self.log.error(e) + await self._update_menu("join") + return + await self.room.update_menu(self.id, RoomState.INVITE) loop = get_running_loop() diff --git a/menuflow/room.py b/menuflow/room.py index 7c9fd8c..b9db846 100644 --- a/menuflow/room.py +++ b/menuflow/room.py @@ -1,12 +1,14 @@ from __future__ import annotations import json -from asyncio import Future +from asyncio import Future, Lock +from collections import defaultdict from logging import getLogger from typing import Any, Dict, cast from mautrix.client import Client as MatrixClient from mautrix.types import EventType, RoomID, StateEventContent +from mautrix.util.async_getter_lock import async_getter_lock from mautrix.util.logging import TraceLogger from .config import Config @@ -18,6 +20,7 @@ class Room(DBRoom): by_room_id: Dict[RoomID, "Room"] = {} pending_invites: Dict[RoomID, Future] = {} + _async_get_locks: dict[Any, Lock] = defaultdict(lambda: Lock()) config: Config log: TraceLogger = getLogger("menuflow.room") @@ -43,6 +46,7 @@ def _add_to_cache(self) -> None: self.by_room_id[self.room_id] = self async def clean_up(self): + self.log.info(f"Cleaning up room {self.room_id}") await Util.cancel_task(task_name=self.room_id) del self.by_room_id[self.room_id] self.variables = "{}" @@ -66,6 +70,7 @@ async def creator(self) -> Dict: return created_room_event.get("creator") @classmethod + @async_getter_lock async def get_by_room_id(cls, room_id: RoomID, create: bool = True) -> "Room" | None: """It gets a room from the database, or creates one if it doesn't exist