diff --git a/morpheus/core/client.py b/morpheus/core/client.py index 29d214a..5295a59 100644 --- a/morpheus/core/client.py +++ b/morpheus/core/client.py @@ -99,6 +99,15 @@ class Client: if handler: await self.invoke(handler, event) + # Process ephemeral events + for event in data['ephemeral']['events']: + if event['type'] == 'm.receipt': + room.update_read_receipts(event['content']) + # TODO Update read receipts for users + elif event['type'] == 'm.typing': + # TODO process typing messages + pass + # Process timeline for event_dict in data["timeline"]["events"]: event_dict["room"] = room @@ -108,22 +117,14 @@ class Client: elif isinstance(event, MessageEvent): if event not in room.message_cache: room.message_cache.append(event) - handler = self.event_dispatchers.get(event.type) - if handler: - await self.invoke(handler, event) - try: - await self.mark_event_read(event) - except RuntimeError as e: - pass - - # Process ephemeral events - for event in data['ephemeral']['events']: - if event['type'] == 'm.receipt': - room.update_read_receipts(event['content']) - # TODO Update read receipts for users - elif event['type'] == 'm.typing': - # TODO process typing messages - pass + if room.read_receipts[self.user_id][1] < event.origin_server_ts: + handler = self.event_dispatchers.get(event.type) + if handler: + await self.invoke(handler, event) + try: + await self.mark_event_read(event) + except RuntimeError as e: + pass async def process_room_invite_events(self, rooms: dict): pass diff --git a/morpheus/core/context.py b/morpheus/core/context.py deleted file mode 100644 index 85636af..0000000 --- a/morpheus/core/context.py +++ /dev/null @@ -1 +0,0 @@ -# TODO Create Context diff --git a/morpheus/core/room.py b/morpheus/core/room.py index f158bdd..6c4b1db 100644 --- a/morpheus/core/room.py +++ b/morpheus/core/room.py @@ -1,5 +1,5 @@ # TODO Add Room class -from typing import List, Optional, Dict +from typing import List, Optional, Dict, Tuple from datetime import datetime, timedelta from collections import deque @@ -42,14 +42,14 @@ class Room: self.heroes: Optional[List[str]] = None self.joined_member_count: Optional[int] = None self.invited_member_count: Optional[int] = None - self.read_receipts: Dict[str, Dict[str, int]] = {} + self.read_receipts: Dict[str, Tuple[str, int]] = {} self.message_cache = deque(maxlen=1000) def update_read_receipts(self, receipts: Dict[str, Dict[str, Dict[str, Dict[str, int]]]]): for event_id, receipt in receipts.items(): users = receipt['m.read'] for user, time in users.items(): - self.read_receipts[user] = {event_id: time['ts']} + self.read_receipts[user] = (event_id, time['ts']) async def update_state(self, state_event=None): from .events import StateEvent diff --git a/morpheus/bot/__init__.py b/morpheus/exts/__init__.py similarity index 100% rename from morpheus/bot/__init__.py rename to morpheus/exts/__init__.py diff --git a/morpheus/exts/bot.py b/morpheus/exts/bot.py new file mode 100644 index 0000000..1f78938 --- /dev/null +++ b/morpheus/exts/bot.py @@ -0,0 +1,26 @@ +import asyncio +from typing import Union, Optional, Dict + +from morpheus.core.client import Client +from morpheus.core.room import Room +from .context import Context + + +class Bot(Client): + def __init__( + self, + prefix: Union[str, list, tuple], + homeserver: str = "https://matrixcoding.chat", + ): + self.loop = asyncio.get_event_loop() + super(Bot, self).__init__(prefix=prefix, homeserver=homeserver) + + def run(self, user_id: str = None, password: str = None, token: str = None): + loop = self.loop or asyncio.get_event_loop() + loop.run_until_complete(super(Bot, self).run(user_id, password, token)) + + async def get_context(self, event): + + + async def check_event(self, event): + diff --git a/morpheus/exts/context.py b/morpheus/exts/context.py new file mode 100644 index 0000000..9bd86a5 --- /dev/null +++ b/morpheus/exts/context.py @@ -0,0 +1,6 @@ +from morpheus.core.client import Client +from morpheus.core.room import Room + +class Context: + def __init__(self, client: Client, room: Room, prefix: str, sender: str, ): + self.client: Client