From 1af2716c544f467208fd8edf5b409686f95ff0bf Mon Sep 17 00:00:00 2001 From: Dusty Pianalto Date: Wed, 6 Nov 2019 22:37:19 -0900 Subject: [PATCH] Add DequeDict Change message_cache to a DequeDict --- morpheus/core/client.py | 4 ++-- morpheus/core/room.py | 5 ++--- morpheus/core/utils.py | 13 +++++++++++++ 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/morpheus/core/client.py b/morpheus/core/client.py index 3879b11..6f9603f 100644 --- a/morpheus/core/client.py +++ b/morpheus/core/client.py @@ -122,8 +122,8 @@ class Client: if isinstance(event, StateEvent): await room.update_state(event) elif isinstance(event, MessageEvent): - if event not in room.message_cache: - room.message_cache.append(event) + if event.event_id not in room.message_cache: + room.message_cache[event.event_id] = event if room.read_receipts[self.user_id][1] < event.origin_server_ts: handlers = self.event_dispatchers.get(event.type) if handlers: diff --git a/morpheus/core/room.py b/morpheus/core/room.py index 6c4b1db..a6b6843 100644 --- a/morpheus/core/room.py +++ b/morpheus/core/room.py @@ -1,4 +1,3 @@ -# TODO Add Room class from typing import List, Optional, Dict, Tuple from datetime import datetime, timedelta from collections import deque @@ -15,7 +14,7 @@ from .content import ( MRoomRelatedGroupsContent, MRoomTopicContent, ) -from .utils import PreviousRoom +from .utils import PreviousRoom, DequeDict class Room: @@ -43,7 +42,7 @@ class Room: self.joined_member_count: Optional[int] = None self.invited_member_count: Optional[int] = None self.read_receipts: Dict[str, Tuple[str, int]] = {} - self.message_cache = deque(maxlen=1000) + self.message_cache = DequeDict(max=1000) def update_read_receipts(self, receipts: Dict[str, Dict[str, Dict[str, Dict[str, int]]]]): for event_id, receipt in receipts.items(): diff --git a/morpheus/core/utils.py b/morpheus/core/utils.py index 038e48b..e798afe 100644 --- a/morpheus/core/utils.py +++ b/morpheus/core/utils.py @@ -1,6 +1,7 @@ from dataclasses import dataclass from typing import Optional, List, Dict from inspect import isawaitable +from collections import OrderedDict @dataclass @@ -108,3 +109,15 @@ async def maybe_coroutine(func, *args, **kwargs): def notification_power_levels_default_factory(): return {'room': 50} + + +class DequeDict(OrderedDict): + def __init__(self, *args, max: int = 0, **kwargs): + self._max = max + super(DequeDict, self).__init__(*args, **kwargs) + + def __setitem__(self, key, value): + OrderedDict.__setitem__(self, key, value) + if self._max > 0: + if len(self) > self._max: + self.popitem(False)