Add DequeDict

Change message_cache to a DequeDict
master
DustyP 6 years ago
parent b133ebef69
commit 1af2716c54

@ -122,8 +122,8 @@ class Client:
if isinstance(event, StateEvent): if isinstance(event, StateEvent):
await room.update_state(event) await room.update_state(event)
elif isinstance(event, MessageEvent): elif isinstance(event, MessageEvent):
if event not in room.message_cache: if event.event_id not in room.message_cache:
room.message_cache.append(event) room.message_cache[event.event_id] = event
if room.read_receipts[self.user_id][1] < event.origin_server_ts: if room.read_receipts[self.user_id][1] < event.origin_server_ts:
handlers = self.event_dispatchers.get(event.type) handlers = self.event_dispatchers.get(event.type)
if handlers: if handlers:

@ -1,4 +1,3 @@
# TODO Add Room class
from typing import List, Optional, Dict, Tuple from typing import List, Optional, Dict, Tuple
from datetime import datetime, timedelta from datetime import datetime, timedelta
from collections import deque from collections import deque
@ -15,7 +14,7 @@ from .content import (
MRoomRelatedGroupsContent, MRoomRelatedGroupsContent,
MRoomTopicContent, MRoomTopicContent,
) )
from .utils import PreviousRoom from .utils import PreviousRoom, DequeDict
class Room: class Room:
@ -43,7 +42,7 @@ class Room:
self.joined_member_count: Optional[int] = None self.joined_member_count: Optional[int] = None
self.invited_member_count: Optional[int] = None self.invited_member_count: Optional[int] = None
self.read_receipts: Dict[str, Tuple[str, int]] = {} 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]]]]): def update_read_receipts(self, receipts: Dict[str, Dict[str, Dict[str, Dict[str, int]]]]):
for event_id, receipt in receipts.items(): for event_id, receipt in receipts.items():

@ -1,6 +1,7 @@
from dataclasses import dataclass from dataclasses import dataclass
from typing import Optional, List, Dict from typing import Optional, List, Dict
from inspect import isawaitable from inspect import isawaitable
from collections import OrderedDict
@dataclass @dataclass
@ -108,3 +109,15 @@ async def maybe_coroutine(func, *args, **kwargs):
def notification_power_levels_default_factory(): def notification_power_levels_default_factory():
return {'room': 50} 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)

Loading…
Cancel
Save