Update Client to send read receipts for every message

Fix bugs in events due to m.related_to in text events
master
DustyP 6 years ago
parent 353990a621
commit d3acd0a114

@ -1,7 +1,7 @@
import asyncio import asyncio
from typing import Union, Optional, Dict from typing import Union, Optional, Dict
from .api import API, APIConfig from .api import API
from .room import Room from .room import Room
@ -111,6 +111,10 @@ class Client:
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)
try:
await self.mark_event_read(event)
except RuntimeError as e:
pass
# Process ephemeral events # Process ephemeral events
for event in data['ephemeral']['events']: for event in data['ephemeral']['events']:
@ -160,6 +164,14 @@ class Client:
raise TypeError(f'handler must be a callable not {type(handler)}') raise TypeError(f'handler must be a callable not {type(handler)}')
self.event_dispatchers[event_type] = handler self.event_dispatchers[event_type] = handler
async def mark_event_read(self, event, receipt_type: str = 'm.read'):
from .events import RoomEvent
if isinstance(event, RoomEvent):
path = self.api.build_url(f'rooms/{event.room.id}/receipt/{receipt_type}/{event.event_id}')
await self.api.send('POST', path)
else:
raise RuntimeError(f'Event to mark read must be an instance of RoomEvent. Not {type(event)}')
async def send_room_message(self, room: Room, content: dict): async def send_room_message(self, room: Room, content: dict):
await self.api.room_send(room_id=room.id, event_type='m.room.message', content=content) await self.api.room_send(room_id=room.id, event_type='m.room.message', content=content)

@ -11,7 +11,8 @@ from .utils import (
PreviousRoom, PreviousRoom,
Invite, Invite,
ReactionRelation, ReactionRelation,
notification_power_levels_default_factory notification_power_levels_default_factory,
MessageRelation
) )
@ -31,6 +32,7 @@ class MTextContent(MessageContentBase):
format: Optional[str] = None format: Optional[str] = None
formatted_body: Optional[str] = None formatted_body: Optional[str] = None
msgtype = "m.text" msgtype = "m.text"
relates_to: Optional[MessageRelation] = None
@dataclass @dataclass

@ -4,7 +4,7 @@ from typing import Optional, List
from .client import Client from .client import Client
from .room import Room from .room import Room
from .content import ContentBase from .content import ContentBase
from .utils import ReactionRelation from .utils import ReactionRelation, MessageRelation
@dataclass @dataclass
@ -28,6 +28,17 @@ class EventBase:
content_dict = {'options': event_dict['content']} content_dict = {'options': event_dict['content']}
else: else:
content_dict = event_dict['content'] content_dict = event_dict['content']
if content_dict.get('m.relates_to'):
if content_dict['m.relates_to'].get('m.in_reply_to'):
content_dict['relates_to'] = MessageRelation(
event_id=content_dict['m.relates_to']['m.in_reply_to']['event_id']
)
del content_dict['m.relates_to']
if content_dict.get('m.new_content'):
del content_dict['m.new_content']
del event_dict['content'] del event_dict['content']
return cls( return cls(

@ -92,5 +92,10 @@ class ReactionRelation:
key: str key: str
@dataclass
class MessageRelation:
event_id: str
def notification_power_levels_default_factory(): def notification_power_levels_default_factory():
return {'room': 50} return {'room': 50}

Loading…
Cancel
Save