diff options
Diffstat (limited to 'src/Controllers/Client/ClientController.php')
| -rw-r--r-- | src/Controllers/Client/ClientController.php | 62 |
1 files changed, 54 insertions, 8 deletions
diff --git a/src/Controllers/Client/ClientController.php b/src/Controllers/Client/ClientController.php index c9eb1fa..cdce91e 100644 --- a/src/Controllers/Client/ClientController.php +++ b/src/Controllers/Client/ClientController.php @@ -2,6 +2,7 @@ namespace App\Controllers\Client; +use App\App; use App\Database; use App\Errors\AppException; use App\Errors\ErrorResponse; @@ -16,6 +17,7 @@ use App\Support\Logger; use App\Support\Parser; use App\Support\RequestValidator; use Matrix\Data\AccountData; +use Matrix\Data\Capabilities; use Matrix\Data\DeviceLists; use Matrix\Data\LoginFlow; use Matrix\Data\Presence; @@ -208,7 +210,7 @@ class ClientController #[Route(path: "_matrix/client/r0/sync", methods: ["GET"])] #[Route(path: "_matrix/client/v3/sync", methods: ["GET"])] public function sync(Request $request): Response - { + { $user = User::authenticateWithRequest($request); $filter = $request->query->get("filter", ""); @@ -216,7 +218,7 @@ class ClientController $setPresence = PresenceState::tryFrom($request->query->get("set_presence") ?? "") ?? PresenceState::ONLINE; $since = $request->query->get("since", ""); $timeout = $request->query->get("timeout", 0); - $useStateAfter = $request->query->get("use_state_after", false); + $useStateAfter = $request->query->get("use_state_after", false) ?: $request->query->get("org.matrix.msc4222.use_state_after", false); if (! empty($filter)) { if (str_starts_with($filter, "{")) { @@ -226,6 +228,18 @@ class ClientController } } + // device one time keys count + $deviceOneTimeKeysCount = Database::getInstance() + ->query("select count(*) from one_time_keys where user_id=:user_id and device_id=:device_id", [ + "user_id" => $user->getId(), + "device_id" => $user->getDeviceId(), + ]) + ->fetchColumn(); + $deviceOneTimeKeysCount = [ + "signed_curve25519" => $deviceOneTimeKeysCount, + ]; + + // rooms $rooms = Database::getInstance()->query(<<<SQL select * from rooms left join room_memberships @@ -240,20 +254,24 @@ class ClientController $knockedRooms = []; $leftRooms = []; + $nextBatch = (new \DateTime())->format("U"); + foreach ($rooms as $room) { $events = Database::getInstance()->query(<<<SQL select * from room_events where room_id = :room_id + and origin_server_timestamp > to_timestamp(:since) SQL, [ "room_id" => $room["room_id"], #"limit" => ($filter["room"]["timeline"]["limit"] ?? false) ? "limit " . $filter["room"]["timeline"]["limit"] : "", + "since" => (empty($since) ? \DateTime::createFromTimestamp(0) : \DateTime::createFromTimestamp($since))->format("U"), ])->fetchAll(); - if ($since === "" && MembershipState::tryFrom($room["state"]) === MembershipState::JOIN) { + if (! empty($events) && MembershipState::tryFrom($room["state"]) === MembershipState::JOIN) { $joinedRooms[$room["room_id"]] = new JoinedRoom( accountData: new AccountData([]), ephemeral: new Ephemeral([]), - state: new State([]), + state: new State(array_map([RoomEvent::class, "transformEvent"], $events)), summary: new RoomSummary( heroes: [], invitedMemberCount: 0, @@ -268,18 +286,25 @@ class ClientController unreadThreadNotifications: [], ); } + + if (! empty($events)) { + $newestEvent = RoomEvent::transformEvent($events[array_key_last($events)]); + $nextBatch = \DateTime::createFromTimestamp($newestEvent->getOriginServerTimestamp())->format("U"); + } + } + + if (($timeout / 1000) > App::getExectionTime()) { + sleep(intval(($timeout / 1000) - App::getExectionTime())); } return new JsonResponse(new ClientSyncGetResponse( - nextBatch: "1", + nextBatch: $nextBatch, accountData: new AccountData([]), deviceLists: new DeviceLists([], []), - deviceOneTimeKeysCount: [ - "signed_curve25519" => 10, - ], + deviceOneTimeKeysCount: $deviceOneTimeKeysCount, presence: new Presence([ new PresenceEvent( @@ -393,4 +418,25 @@ class ClientController ), ]); } + + #[Route(path: "/_matrix/client/v3/capabilities", methods: ["GET"])] + public function capabilities(Request $request): Response + { + $user = User::authenticateWithRequest($request); + + return new JsonResponse(new Capabilities()); + } + + #[Route(path: "/_matrix/client/v3/voip/turnServer", methods: ["GET"])] + public function voipTurnServer(Request $request): Response + { + $user = User::authenticateWithRequest($request); + + return new JsonResponse([ + "password" => "", + "ttl" => 86400, + "uris" => [], + "username" => "", + ]); + } } |
