Change event processing

The handlers are now only called if the origin_server_ts is greater than the client's last read receipt timestamp
This commit is contained in:
Dusty Pianalto 2019-11-01 22:20:04 -08:00
parent d3acd0a114
commit d8f53a35be
6 changed files with 52 additions and 20 deletions

View File

@ -99,6 +99,15 @@ class Client:
if handler: if handler:
await self.invoke(handler, event) 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 # Process timeline
for event_dict in data["timeline"]["events"]: for event_dict in data["timeline"]["events"]:
event_dict["room"] = room event_dict["room"] = room
@ -108,22 +117,14 @@ class Client:
elif isinstance(event, MessageEvent): elif isinstance(event, MessageEvent):
if event not in room.message_cache: if event not in room.message_cache:
room.message_cache.append(event) room.message_cache.append(event)
handler = self.event_dispatchers.get(event.type) if room.read_receipts[self.user_id][1] < event.origin_server_ts:
if handler: handler = self.event_dispatchers.get(event.type)
await self.invoke(handler, event) if handler:
try: await self.invoke(handler, event)
await self.mark_event_read(event) try:
except RuntimeError as e: await self.mark_event_read(event)
pass 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
async def process_room_invite_events(self, rooms: dict): async def process_room_invite_events(self, rooms: dict):
pass pass

View File

@ -1 +0,0 @@
# TODO Create Context

View File

@ -1,5 +1,5 @@
# TODO Add Room class # TODO Add Room class
from typing import List, Optional, Dict 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
@ -42,14 +42,14 @@ class Room:
self.heroes: Optional[List[str]] = None self.heroes: Optional[List[str]] = None
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, Dict[str, int]] = {} self.read_receipts: Dict[str, Tuple[str, int]] = {}
self.message_cache = deque(maxlen=1000) self.message_cache = deque(maxlen=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():
users = receipt['m.read'] users = receipt['m.read']
for user, time in users.items(): 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): async def update_state(self, state_event=None):
from .events import StateEvent from .events import StateEvent

26
morpheus/exts/bot.py Normal file
View File

@ -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):

6
morpheus/exts/context.py Normal file
View File

@ -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