Change event processing

The handlers are now only called if the origin_server_ts is greater than the client's last read receipt timestamp
master
DustyP 6 years ago
parent d3acd0a114
commit d8f53a35be

@ -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,6 +117,7 @@ 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)
if room.read_receipts[self.user_id][1] < event.origin_server_ts:
handler = self.event_dispatchers.get(event.type) handler = self.event_dispatchers.get(event.type)
if handler: if handler:
await self.invoke(handler, event) await self.invoke(handler, event)
@ -116,15 +126,6 @@ class Client:
except RuntimeError as e: except RuntimeError as e:
pass 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

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

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

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

@ -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
Loading…
Cancel
Save