summaryrefslogtreecommitdiff
path: root/src/Controllers/SyncController.php
diff options
context:
space:
mode:
Diffstat (limited to 'src/Controllers/SyncController.php')
-rwxr-xr-xsrc/Controllers/SyncController.php168
1 files changed, 86 insertions, 82 deletions
diff --git a/src/Controllers/SyncController.php b/src/Controllers/SyncController.php
index 243fab5..acebb11 100755
--- a/src/Controllers/SyncController.php
+++ b/src/Controllers/SyncController.php
@@ -3,13 +3,23 @@
namespace App\Controllers;
use App\Database;
-use App\Errors\UnauthorizedError;
-use App\Events\PresenceEvent;
-use App\Events\RoomMemberEvent;
-use App\Events\RoomMessageEvent;
+use App\Models\RoomEvent;
use App\Models\User;
-use App\Types\MembershipState;
-use App\Types\PresenceState;
+use Matrix\Data\AccountData;
+use Matrix\Data\DeviceLists;
+use Matrix\Data\Presence;
+use Matrix\Data\Room\Ephemeral;
+use Matrix\Data\Room\JoinedRoom;
+use Matrix\Data\Room\RoomSummary;
+use Matrix\Data\Room\Rooms;
+use Matrix\Data\Room\State;
+use Matrix\Data\Room\Timeline;
+use Matrix\Data\Room\UnreadNotificationCounts;
+use Matrix\Data\ToDevice;
+use Matrix\Enums\MembershipState;
+use Matrix\Enums\PresenceState;
+use Matrix\Events\PresenceEvent;
+use Matrix\Responses\ClientSyncGetResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\JsonResponse;
@@ -24,99 +34,93 @@ class SyncController
*/
public function sync(Request $request): Response
{
- $accessToken = str_replace("Bearer ", "", $request->headers->get("authorization") ?: "");
- $user = User::fetchWithAccessToken($accessToken);
-
- if (empty($user)) {
- throw new UnauthorizedError();
- }
+ $user = User::authenticateWithRequest($request);
$filter = $request->query->get("filter", "");
$syncFullState = $request->query->get("full_state", false);
$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);
+
+ if (! empty($filter)) {
+ if (str_starts_with($filter, "{")) {
+ $filter = json_decode($filter, true);
+ } else {
+ $filter = Database::getInstance()->query("select * from filters where id=:id", ["id" => $filter])->fetch();
+ }
+ }
$rooms = Database::getInstance()->query(<<<SQL
select * from rooms
- SQL)->fetchAll();
-
- $joinedRooms = new \stdClass();
- if (! empty($rooms)) {
- $joinedRooms = [];
- foreach ($rooms as $room) {
- $joinedRooms[$room["id"]] = [
- "account_data" => [
- "events" => [],
- ],
-
- "ephemeral" => [
- "events" => [],
- ],
-
- "state" => [
- "events" => [],
- ],
-
- "summary" => [
- "m.heroes" => [],
- "m.invited_member_count" => 0,
- "m.joined_member_count" => 1,
- ],
-
- "timeline" => [
- "events" => [
- (new RoomMemberEvent($user->getId(), $user->getId(), MembershipState::JOIN))->toJsonEncodeable(),
- (new RoomMessageEvent($user->getId(), "Hallo Test Nachricht"))->toJsonEncodeable(),
- ],
- "limited" => false,
- "prev_batch" => "",
- ],
-
- "unread_notifications" => [
- "highlight_count" => random_int(0, 1),
- "notification_count" => random_int(0, 10),
- ],
-
- "unread_thread_notifications" => new \stdClass(),
- ];
+ left join room_memberships
+ on rooms.id = room_memberships.room_id
+ where room_memberships.user_id = :user_id
+ SQL, [
+ "user_id" => $user->getId(),
+ ])->fetchAll();
+
+ $invitedRooms = [];
+ $joinedRooms = [];
+ $knockedRooms = [];
+ $leftRooms = [];
+
+ foreach ($rooms as $room) {
+ $events = Database::getInstance()->query(<<<SQL
+ select * from room_events
+ where room_id = :room_id
+ SQL, [
+ "room_id" => $room["room_id"],
+ #"limit" => ($filter["room"]["timeline"]["limit"] ?? false) ? "limit " . $filter["room"]["timeline"]["limit"] : "",
+ ])->fetchAll();
+
+ if ($since === "" && MembershipState::tryFrom($room["state"]) === MembershipState::JOIN) {
+ $joinedRooms[$room["room_id"]] = new JoinedRoom(
+ accountData: new AccountData([]),
+ ephemeral: new Ephemeral([]),
+ state: new State([]),
+ summary: new RoomSummary(
+ heroes: [],
+ invitedMemberCount: 0,
+ joinedMemberCount: 1,
+ ),
+ timeline: new Timeline(
+ events: array_map([RoomEvent::class, "transformEvent"], $events),
+ limited: false,# $filter["room"]["timeline"]["limit"] ?? false,
+ previousBatch: null,
+ ),
+ unreadNotifications: new UnreadNotificationCounts(0, 0),
+ unreadThreadNotifications: [],
+ );
}
}
- return new JsonResponse([
- "account_data" => [
- "events" => [
+ return new JsonResponse(new ClientSyncGetResponse(
+ nextBatch: "1",
- ],
- ],
+ accountData: new AccountData([]),
- "device_lists" => [
- "changed" => [],
- "left" => [],
- ],
+ deviceLists: new DeviceLists([], []),
- "device_one_time_keys_count" => [
+ deviceOneTimeKeysCount: [
"signed_curve25519" => 10,
],
- "next_batch" => "next_batch_id",
-
- "presence" => [
- "events" => [
- (new PresenceEvent(sender: $user->getId()))->toJsonEncodeable(),
- ],
- ],
-
- "rooms" => [
- "invite" => new \stdClass(),
- "join" => $joinedRooms,
- "knock" => new \stdClass(),
- "leave" => new \stdClass(),
- ],
-
- "to_device" => [
- "events" => [],
- ],
- ]);
+ presence: new Presence([
+ new PresenceEvent(
+ sender: $user->getId(),
+ presence: $setPresence,
+ ),
+ ]),
+
+ rooms: new Rooms(
+ $invitedRooms,
+ $joinedRooms,
+ $knockedRooms,
+ $leftRooms,
+ ),
+
+ toDevice: new ToDevice([]),
+ ));
}
}