summaryrefslogtreecommitdiff
path: root/src/Controllers/RoomController.php
diff options
context:
space:
mode:
Diffstat (limited to 'src/Controllers/RoomController.php')
-rwxr-xr-xsrc/Controllers/RoomController.php84
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([