1# Copyright 2017 Vector Creations Ltd 2# 3# Licensed under the Apache License, Version 2.0 (the "License"); 4# you may not use this file except in compliance with the License. 5# You may obtain a copy of the License at 6# 7# http://www.apache.org/licenses/LICENSE-2.0 8# 9# Unless required by applicable law or agreed to in writing, software 10# distributed under the License is distributed on an "AS IS" BASIS, 11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12# See the License for the specific language governing permissions and 13# limitations under the License. 14 15import logging 16from typing import TYPE_CHECKING, Tuple 17 18from synapse.api.constants import ReadReceiptEventFields, ReceiptTypes 19from synapse.api.errors import Codes, SynapseError 20from synapse.http.server import HttpServer 21from synapse.http.servlet import RestServlet, parse_json_object_from_request 22from synapse.http.site import SynapseRequest 23from synapse.types import JsonDict 24 25from ._base import client_patterns 26 27if TYPE_CHECKING: 28 from synapse.server import HomeServer 29 30logger = logging.getLogger(__name__) 31 32 33class ReadMarkerRestServlet(RestServlet): 34 PATTERNS = client_patterns("/rooms/(?P<room_id>[^/]*)/read_markers$") 35 36 def __init__(self, hs: "HomeServer"): 37 super().__init__() 38 self.auth = hs.get_auth() 39 self.receipts_handler = hs.get_receipts_handler() 40 self.read_marker_handler = hs.get_read_marker_handler() 41 self.presence_handler = hs.get_presence_handler() 42 43 async def on_POST( 44 self, request: SynapseRequest, room_id: str 45 ) -> Tuple[int, JsonDict]: 46 requester = await self.auth.get_user_by_req(request) 47 48 await self.presence_handler.bump_presence_active_time(requester.user) 49 50 body = parse_json_object_from_request(request) 51 read_event_id = body.get(ReceiptTypes.READ, None) 52 hidden = body.get(ReadReceiptEventFields.MSC2285_HIDDEN, False) 53 54 if not isinstance(hidden, bool): 55 raise SynapseError( 56 400, 57 "Param %s must be a boolean, if given" 58 % ReadReceiptEventFields.MSC2285_HIDDEN, 59 Codes.BAD_JSON, 60 ) 61 62 if read_event_id: 63 await self.receipts_handler.received_client_receipt( 64 room_id, 65 ReceiptTypes.READ, 66 user_id=requester.user.to_string(), 67 event_id=read_event_id, 68 hidden=hidden, 69 ) 70 71 read_marker_event_id = body.get("m.fully_read", None) 72 if read_marker_event_id: 73 await self.read_marker_handler.received_client_read_marker( 74 room_id, 75 user_id=requester.user.to_string(), 76 event_id=read_marker_event_id, 77 ) 78 79 return 200, {} 80 81 82def register_servlets(hs: "HomeServer", http_server: HttpServer) -> None: 83 ReadMarkerRestServlet(hs).register(http_server) 84