Update Client to send read receipts for every message

Fix bugs in events due to m.related_to in text events
This commit is contained in:
Dusty Pianalto 2019-11-01 18:15:21 -08:00
parent 353990a621
commit d3acd0a114
4 changed files with 33 additions and 3 deletions

View File

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

View File

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

View File

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

View File

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