diff options
Diffstat (limited to 'src/Controllers/SyncController.php')
| -rwxr-xr-x | src/Controllers/SyncController.php | 168 |
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([]), + )); } } |
