attributes->get("roomAlias"); $roomAlias = Parser::parseRoomAlias($alias); # TODO: on parse error => 400 $roomId = null; if ($roomAlias["server"] != $_ENV["DOMAIN"]) { # TODO: federation API resolve $roomId = -1; } else { $room = Database::getInstance()->query(<< $roomAlias["name"], ])->fetch(); $roomId = $room["id"] ?? null; } if (empty($roomId)) { throw new AppException( ErrorCode::NOT_FOUND, "Room alias $alias not found.", Response::HTTP_NOT_FOUND ); } return new JsonResponse([ "room_id" => $roomId, "servers" => [], ]); } /** * PUT /_matrix/client/v3/rooms/{roomId}/send/{eventType}/{txnId} * * @see https://spec.matrix.org/v1.15/client-server-api/#put_matrixclientv3roomsroomidsendeventtypetxnid */ public function send(Request $request): Response { $accessToken = str_replace("Bearer ", "", $request->headers->get("authorization") ?: ""); $user = User::fetchWithAccessToken($accessToken); if (empty($user)) { throw new UnauthorizedError(); } $roomId = $request->attributes->get("roomId"); $eventType = EventType::from($request->attributes->get("eventType")); $transactionId = $request->attributes->get("txnId"); $body = json_decode($request->getContent(), true); RequestValidator::validateJson(); $message = $body["body"]; $messageType = MessageType::from($body["msgtype"]); $eventId = "\$" . md5(random_bytes(512)) . ":" . $_ENV["DOMAIN"]; $event = new RoomMessageEvent( id: $eventId, sender: $user->getId(), originServerTimestamp: new \DateTime("now"), content: [ "body" => $message, "msgtype" => $messageType->value, ], unsigned: [ "age" => 1234, "membership" => MembershipState::JOIN->value, ], roomId: $roomId, ); $event->insert(); return new JsonResponse([ "event_id" => $eventId, ]); } }