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:
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,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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
26
morpheus/exts/bot.py
Normal file
26
morpheus/exts/bot.py
Normal 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
6
morpheus/exts/context.py
Normal 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
|
||||||
Loading…
x
Reference in New Issue
Block a user