summaryrefslogtreecommitdiff
path: root/src/Controllers/RoomController.php
diff options
context:
space:
mode:
Diffstat (limited to 'src/Controllers/RoomController.php')
-rwxr-xr-xsrc/Controllers/RoomController.php154
1 files changed, 151 insertions, 3 deletions
diff --git a/src/Controllers/RoomController.php b/src/Controllers/RoomController.php
index c02d5ce..dcc0415 100755
--- a/src/Controllers/RoomController.php
+++ b/src/Controllers/RoomController.php
@@ -7,18 +7,155 @@ use App\Errors\AppException;
use App\Errors\ErrorCode;
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 App\Types\EventType;
-use App\Types\MembershipState;
-use App\Types\MessageType;
+use Matrix\Enums\EventType;
+use Matrix\Enums\MembershipState;
+use Matrix\Enums\MessageType;
+use Matrix\Enums\RoomGuestAccess;
+use Matrix\Enums\RoomHistoryVisibility;
+use Matrix\Enums\RoomJoinRule;
+use Matrix\Enums\RoomVisibility;
+use Matrix\Events\Room\CreateEvent;
+use Matrix\Events\Room\GuestAccessEvent;
+use Matrix\Events\Room\HistoryVisibilityEvent;
+use Matrix\Events\Room\JoinRulesEvent;
+use Matrix\Events\Room\MemberEvent;
+use Matrix\Events\Room\NameEvent;
+use Matrix\Events\Room\PowerLevelsEvent;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\JsonResponse;
class RoomController
{
+ public function createRoom(Request $request): Response
+ {
+ $user = User::authenticateWithRequest($request);
+ $body = json_decode($request->getContent(), true);
+ RequestValidator::validateJson();
+
+ $creationContent = $body["creation_content"] ?? [];
+ $initialState = $body["initial_state"] ?? [];
+ $invite = $body["invite"] ?? [];
+ $body["invite_3pid"] ?? [];
+ $body["is_direct"] ?? false;
+ $name = $body["name"] ?? "";
+ $body["power_level_content_override"] ?? [];
+ $preset = $body["preset"] ?? "";
+ $roomAliasName = $body["room_alias_name"] ?? "";
+ $roomVersion = $body["room_version"] ?? "DEFAULT_ROOM_VERSION";
+ $topic = $body["topic"] ?? "";
+ $visibility = RoomVisibility::tryFrom($body["visibility"] ?? "private");
+
+ if (! $preset) {
+ $preset = $visibility->value . "_chat";
+ }
+
+ # TODO: get events for preset
+ # TODO: override preset events with initial state
+ # TODO: override events with name and topic if applicable
+ $state = [];
+
+ if ($name) {
+ $state[EventType::ROOM_NAME->value] = $name;
+ }
+
+ if ($topic) {
+ $state[EventType::ROOM_TOPIC->value] = $topic;
+ }
+
+ // create room
+ $roomId = Id::generateRoomId();
+ Database::getInstance()->query(<<<SQL
+ insert into rooms (id, name) values (:id, :name)
+ SQL, [
+ "id" => $roomId,
+ "name" => $roomAliasName, # "#$roomAliasName:$_ENV[DOMAIN]",
+ ]);
+
+ $roomCreateEvent = new RoomEvent(new CreateEvent(
+ eventId: Id::generateEventId(),
+ originServerTimestamp: time(),
+ roomId: $roomId,
+ sender: $user->getId(),
+ roomVersion: "12",
+ ));
+ $roomCreateEvent->insert();
+
+ $roomMemberEvent = new RoomEvent(new MemberEvent(
+ eventId: Id::generateEventId(),
+ originServerTimestamp: time(),
+ roomId: $roomId,
+ sender: $user->getId(),
+ stateKey: $user->getId(),
+ isDirect: false,
+ membership: MembershipState::JOIN,
+ displayName: $user->getName(),
+ ));
+ $roomMemberEvent->insert();
+
+ $roomPowerLevelsEvent = new RoomEvent(new PowerLevelsEvent(
+ eventId: Id::generateEventId(),
+ originServerTimestamp: time(),
+ roomId: $roomId,
+ sender: $user->getId(),
+ ));
+ $roomPowerLevelsEvent->insert();
+
+ $roomJoinRulesEvent = new RoomEvent(new JoinRulesEvent(
+ eventId: Id::generateEventId(),
+ originServerTimestamp: time(),
+ roomId: $roomId,
+ sender: $user->getId(),
+ joinRule: RoomJoinRule::INVITE,
+ ));
+ $roomJoinRulesEvent->insert();
+
+ $roomHistoryVisibilityEvent = new RoomEvent(new HistoryVisibilityEvent(
+ eventId: Id::generateEventId(),
+ originServerTimestamp: time(),
+ roomId: $roomId,
+ sender: $user->getId(),
+ historyVisibility: RoomHistoryVisibility::SHARED,
+ ));
+ $roomHistoryVisibilityEvent->insert();
+
+ $roomGuestAccessEvent = new RoomEvent(new GuestAccessEvent(
+ eventId: Id::generateEventId(),
+ originServerTimestamp: time(),
+ roomId: $roomId,
+ sender: $user->getId(),
+ guestAccess: RoomGuestAccess::CAN_JOIN,
+ ));
+ $roomGuestAccessEvent->insert();
+
+ $roomNameEvent = new RoomEvent(new NameEvent(
+ eventId: Id::generateEventId(),
+ originServerTimestamp: time(),
+ roomId: $roomId,
+ sender: $user->getId(),
+ name: $roomAliasName,
+ ));
+ $roomNameEvent->insert();
+
+ Database::getInstance()->query(<<<SQL
+ insert into room_memberships (room_id, user_id, state)
+ values (:room_id, :user_id, :state)
+ SQL, [
+ "room_id" => $roomId,
+ "user_id" => $user->getId(),
+ "state" => MembershipState::JOIN->value,
+ ]);
+
+ return new JsonResponse([
+ "room_id" => $roomId,
+ ]);
+ }
+
/**
* GET /_matrix/client/v3/directory/room/{roomAlias}
*
@@ -59,6 +196,17 @@ class RoomController
]);
}
+ public function readMarkers(Request $request): Response
+ {
+ $user = User::authenticateWithRequest($request);
+ $body = json_decode($request->getContent(), true);
+ RequestValidator::validateJson();
+
+ $roomId = $request->attributes->get("roomId");
+
+ return new JsonResponse();
+ }
+
/**
* PUT /_matrix/client/v3/rooms/{roomId}/send/{eventType}/{txnId}
*