diff options
Diffstat (limited to 'src/Controllers/RoomController.php')
| -rwxr-xr-x | src/Controllers/RoomController.php | 84 |
1 files changed, 64 insertions, 20 deletions
diff --git a/src/Controllers/RoomController.php b/src/Controllers/RoomController.php index dcc0415..060a030 100755 --- a/src/Controllers/RoomController.php +++ b/src/Controllers/RoomController.php @@ -4,14 +4,15 @@ namespace App\Controllers; use App\Database; use App\Errors\AppException; -use App\Errors\ErrorCode; +use App\Errors\Exception; use App\Errors\UnauthorizedError; -use App\Events\RoomMessageEvent; use App\Models\RoomEvent; use App\Models\User; use App\Support\Id; use App\Support\Parser; use App\Support\RequestValidator; +use Matrix\Data\UnsignedData; +use Matrix\Enums\ErrorCode; use Matrix\Enums\EventType; use Matrix\Enums\MembershipState; use Matrix\Enums\MessageType; @@ -19,6 +20,7 @@ use Matrix\Enums\RoomGuestAccess; use Matrix\Enums\RoomHistoryVisibility; use Matrix\Enums\RoomJoinRule; use Matrix\Enums\RoomVisibility; +use Matrix\Events\ClientEvent; use Matrix\Events\Room\CreateEvent; use Matrix\Events\Room\GuestAccessEvent; use Matrix\Events\Room\HistoryVisibilityEvent; @@ -196,6 +198,51 @@ class RoomController ]); } + /** + * GET /_matrix/client/v3/rooms/{roomId}/messages + */ + public function getMessages(Request $request): Response + { + $user = User::authenticateWithRequest($request); + + $roomId = $request->attributes->get("roomId"); + + $membership = Database::getInstance() + ->query("select state from room_memberships where user_id=:user_id and room_id=:room_id", [ + "user_id" => $user->getId(), + "room_id" => $roomId, + ]) + ->fetchColumn(); + + if (MembershipState::from($membership) !== MembershipState::JOIN) { + throw new Exception(ErrorCode::FORBIDDEN, "You aren't a member of the room.", Response::HTTP_FORBIDDEN); + } + + $direction = $request->query->get("dir"); + $filter = $request->query->get("filter"); + $from = $request->query->get("from"); + $limit = $request->query->get("limit", 10); + $to = $request->query->get("to"); + + $events = Database::getInstance()->query(<<<SQL + select * from room_events + where room_id = :room_id + SQL, [ + "room_id" => $roomId, + #"limit" => ($filter["room"]["timeline"]["limit"] ?? false) ? "limit " . $filter["room"]["timeline"]["limit"] : "", + ])->fetchAll(); + + return new JsonResponse([ + "chunk" => array_map([RoomEvent::class, "transformEvent"], $events), + "end" => "", + "start" => "", + "state" => [], + ]); + } + + /** + * POST /_matrix/client/v3/rooms/{roomId}/read_markers + */ public function readMarkers(Request $request): Response { $user = User::authenticateWithRequest($request); @@ -214,8 +261,7 @@ class RoomController */ public function send(Request $request): Response { - $accessToken = str_replace("Bearer ", "", $request->headers->get("authorization") ?: ""); - $user = User::fetchWithAccessToken($accessToken); + $user = User::authenticateWithRequest($request); if (empty($user)) { throw new UnauthorizedError(); @@ -228,24 +274,22 @@ class RoomController $body = json_decode($request->getContent(), true); RequestValidator::validateJson(); - $message = $body["body"]; - $messageType = MessageType::from($body["msgtype"]); + // validate msgtype + 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, - ], + $eventId = Id::generateEventId(); + $event = new RoomEvent(new ClientEvent( + content: $body, + eventId: $eventId, + originServerTimestamp: time(), roomId: $roomId, - ); + sender: $user->getId(), + type: $eventType, + unsigned: new UnsignedData( + age: 1234, # TODO + membership: MembershipState::JOIN, + ), + )); $event->insert(); return new JsonResponse([ |
