Line data Source code
1 : import 'package:matrix/matrix.dart'; 2 : 3 : /// The kind of what has changed with this m.room.member event to have a 4 : /// comparable type. 5 : enum RoomMemberChangeType { 6 : /// The user has changed the avatar. 7 : avatar, 8 : 9 : /// The user has changed the displayname. 10 : displayname, 11 : 12 : /// The user has joined the chat from being not a user before. The user 13 : /// also was not invited before. 14 : join, 15 : 16 : /// The user was invited before and has joined. 17 : acceptInvite, 18 : 19 : /// The user was invited before and has left. 20 : rejectInvite, 21 : 22 : /// The user was invited before and the invitation got withdrawn by someone. 23 : withdrawInvitation, 24 : 25 : /// The user was joined before and has now left the room by themself. 26 : leave, 27 : 28 : /// The user was joined before and has now been kicked out of the room by 29 : /// someone. 30 : kick, 31 : 32 : /// The user has been invited by someone. 33 : invite, 34 : 35 : /// The user has been banned by someone. 36 : ban, 37 : 38 : /// The user was banned before and has been unbanned by someone. 39 : unban, 40 : 41 : /// The user was not a member of the room and now knocks. 42 : knock, 43 : 44 : /// Something else which is not handled yet. 45 : other, 46 : } 47 : 48 : extension RoomMemberChangeTypeExtension on Event { 49 : /// Returns the comparable type of this m.room.member event to handle this 50 : /// differently in the UI. If the event is not of the type m.room.member, 51 : /// this throws an exception! 52 2 : RoomMemberChangeType get roomMemberChangeType { 53 4 : if (type != EventTypes.RoomMember) { 54 0 : throw Exception( 55 0 : 'Tried to call `roomMemberChangeType` but the Event has a type of `$type`', 56 : ); 57 : } 58 : 59 : // Has the membership changed? 60 4 : final newMembership = content.tryGet<String>('membership') ?? ''; 61 4 : final oldMembership = prevContent?.tryGet<String>('membership') ?? ''; 62 : 63 2 : if (newMembership != oldMembership) { 64 4 : if (oldMembership == 'invite' && newMembership == 'join') { 65 : return RoomMemberChangeType.acceptInvite; 66 4 : } else if (oldMembership == 'invite' && newMembership == 'leave') { 67 6 : if (stateKey == senderId) { 68 : return RoomMemberChangeType.rejectInvite; 69 : } else { 70 : return RoomMemberChangeType.withdrawInvitation; 71 : } 72 4 : } else if ((oldMembership == 'leave' || oldMembership == '') && 73 2 : newMembership == 'join') { 74 : return RoomMemberChangeType.join; 75 4 : } else if (oldMembership == 'join' && newMembership == 'ban') { 76 : return RoomMemberChangeType.ban; 77 2 : } else if (oldMembership == 'join' && 78 2 : newMembership == 'leave' && 79 6 : stateKey != senderId) { 80 : return RoomMemberChangeType.kick; 81 2 : } else if (oldMembership == 'join' && 82 2 : newMembership == 'leave' && 83 0 : stateKey == senderId) { 84 : return RoomMemberChangeType.leave; 85 4 : } else if (oldMembership != newMembership && newMembership == 'ban') { 86 : return RoomMemberChangeType.ban; 87 2 : } else if (oldMembership == 'ban' && newMembership == 'leave') { 88 : return RoomMemberChangeType.unban; 89 2 : } else if (newMembership == 'invite') { 90 : return RoomMemberChangeType.invite; 91 0 : } else if (newMembership == 'knock') { 92 : return RoomMemberChangeType.knock; 93 : } 94 0 : } else if (newMembership == 'join') { 95 0 : final newAvatar = content.tryGet<String>('avatar_url') ?? ''; 96 0 : final oldAvatar = prevContent?.tryGet<String>('avatar_url') ?? ''; 97 : 98 0 : final newDisplayname = content.tryGet<String>('displayname') ?? ''; 99 0 : final oldDisplayname = prevContent?.tryGet<String>('displayname') ?? ''; 100 : 101 : // Has the user avatar changed? 102 0 : if (newAvatar != oldAvatar) { 103 : return RoomMemberChangeType.avatar; 104 : } 105 : // Has the user displayname changed? 106 0 : else if (newDisplayname != oldDisplayname && stateKey != null) { 107 : return RoomMemberChangeType.displayname; 108 : } 109 : } 110 : return RoomMemberChangeType.other; 111 : } 112 : }