From c118b01d98c1c0ddabb0329d651d3fa67dab043f Mon Sep 17 00:00:00 2001 From: Airyzz <36567925+Airyzz@users.noreply.github.com> Date: Sat, 11 Apr 2026 13:35:05 +0930 Subject: [PATCH] Add handling for owner role --- commet/lib/client/matrix/matrix_role.dart | 6 ++++- commet/lib/client/matrix/matrix_room.dart | 27 ++++++++++++++++--- .../matrix/matrix_room_permissions_page.dart | 16 ++++++++--- 3 files changed, 41 insertions(+), 8 deletions(-) diff --git a/commet/lib/client/matrix/matrix_role.dart b/commet/lib/client/matrix/matrix_role.dart index 160cb2154..0e137b2d8 100644 --- a/commet/lib/client/matrix/matrix_role.dart +++ b/commet/lib/client/matrix/matrix_role.dart @@ -6,7 +6,11 @@ class MatrixRole implements Role { late int rank; MatrixRole(this.powerLevel, {String? nameOverride, IconData? iconOverride}) { - if (powerLevel >= 100) { + if (powerLevel >= 150) { + name = "Owner"; + rank = 150; + icon = Icons.local_police; + } else if (powerLevel >= 100) { name = "Admin"; rank = 100; icon = Icons.security; diff --git a/commet/lib/client/matrix/matrix_room.dart b/commet/lib/client/matrix/matrix_room.dart index 6af321e96..80d5348e2 100644 --- a/commet/lib/client/matrix/matrix_room.dart +++ b/commet/lib/client/matrix/matrix_room.dart @@ -701,10 +701,31 @@ class MatrixRoom extends Room { var ids = roles.keys; - var result = - ids.map((e) => (getMemberOrFallback(e), MatrixRole(roles[e]))).toList(); + List<(Member, MatrixRole)> result = List.empty(growable: true); + + var creationEvent = _matrixRoom.states[matrix.EventTypes.RoomCreate]?[""]; + var creator = creationEvent?.senderId; + var roomVersion = int.tryParse(_matrixRoom.roomVersion ?? "1"); + + if (roomVersion != null && roomVersion >= 12) { + if (_matrixRoom.roomVersion != null && creator != null) { + var additionalCreators = + creationEvent?.content.tryGetList("additional_creators"); + + for (var id in [ + creator, + if (additionalCreators != null) ...additionalCreators + ]) { + result.add((getMemberOrFallback(id), MatrixRole(150))); + } + } + } + + result.addAll(ids + .map((e) => (getMemberOrFallback(e), MatrixRole(roles[e]))) + .where((element) => element.$2.rank != 0)); - result.removeWhere((element) => element.$2.rank == 0); + result; result.sort((a, b) => b.$2.rank.compareTo(a.$2.rank)); diff --git a/commet/lib/ui/pages/settings/categories/room/permissions/matrix/matrix_room_permissions_page.dart b/commet/lib/ui/pages/settings/categories/room/permissions/matrix/matrix_room_permissions_page.dart index def330d65..cea9bd7de 100644 --- a/commet/lib/ui/pages/settings/categories/room/permissions/matrix/matrix_room_permissions_page.dart +++ b/commet/lib/ui/pages/settings/categories/room/permissions/matrix/matrix_room_permissions_page.dart @@ -51,6 +51,12 @@ class _MatrixRoomPermissionsPageState extends State { late List permissions; bool loading = false; + String get labelMatrixPermissionsRoleOwner => Intl.message( + "Owner", + name: "labelMatrixPermissionsRoleOwner", + desc: "Label for the room owner role", + ); + String get labelMatrixPermissionsRoleAdmin => Intl.message( "Admin", name: "labelMatrixPermissionsRoleAdmin", @@ -236,10 +242,14 @@ class _MatrixRoomPermissionsPageState extends State { void initPermissions() { bool isCalendarRoom = widget.showCalendarPermissions; + var version = int.tryParse(widget.room.roomVersion ?? "1"); roles = [ - // MatrixRoomRoleEntry( - // name: "Founder", powerlevel: 101, icon: Icons.star_rounded), + if (version != null && version >= 12) + MatrixRoomRoleEntry( + name: labelMatrixPermissionsRoleOwner, + powerlevel: 150, + icon: Icons.local_police), MatrixRoomRoleEntry( name: labelMatrixPermissionsRoleAdmin, powerlevel: 100, @@ -250,14 +260,12 @@ class _MatrixRoomPermissionsPageState extends State { powerlevel: 50, icon: Icons.shield_rounded, ), - if (isCalendarRoom) MatrixRoomRoleEntry( name: "Calendar Moderator", powerlevel: 25, icon: Icons.edit_calendar, ), - MatrixRoomRoleEntry( name: labelMatrixPermissionsRoleMember, powerlevel: 0,