summaryrefslogtreecommitdiff
path: root/src/Controllers/Client/ClientController.php
diff options
context:
space:
mode:
Diffstat (limited to 'src/Controllers/Client/ClientController.php')
-rw-r--r--src/Controllers/Client/ClientController.php62
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" => "",
+ ]);
+ }
}