From 08043c06f4f009ca37483b6325488544082f9383 Mon Sep 17 00:00:00 2001 From: Lukas Lihotzki Date: Tue, 30 Mar 2021 13:55:49 +0200 Subject: [PATCH] refactor: high-level loops --- lib/encryption/ssss.dart | 32 +++++++------------- lib/src/client.dart | 53 ++++++++++++++++------------------ lib/src/database/database.dart | 12 ++------ lib/src/event.dart | 8 +---- lib/src/room.dart | 42 +++++++++------------------ lib/src/timeline.dart | 4 +-- 6 files changed, 53 insertions(+), 98 deletions(-) diff --git a/lib/encryption/ssss.dart b/lib/encryption/ssss.dart index ecad784d..6c3342c4 100644 --- a/lib/encryption/ssss.dart +++ b/lib/encryption/ssss.dart @@ -121,10 +121,7 @@ class SSSS { static Uint8List decodeRecoveryKey(String recoveryKey) { final result = base58.decode(recoveryKey.replaceAll(' ', '')); - var parity = 0; - for (final b in result) { - parity ^= b; - } + final parity = result.fold(0, (a, b) => a ^ b); if (parity != 0) { throw Exception('Incorrect parity'); } @@ -144,15 +141,8 @@ class SSSS { } static String encodeRecoveryKey(Uint8List recoveryKey) { - final keyToEncode = []; - for (final b in olmRecoveryKeyPrefix) { - keyToEncode.add(b); - } - keyToEncode.addAll(recoveryKey); - var parity = 0; - for (final b in keyToEncode) { - parity ^= b; - } + final keyToEncode = [...olmRecoveryKeyPrefix, ...recoveryKey]; + final parity = keyToEncode.fold(0, (a, b) => a ^ b); keyToEncode.add(parity); // base58-encode and add a space every four chars return base58 @@ -233,10 +223,12 @@ class SSSS { const keyidByteLength = 24; // make sure we generate a unique key id - var keyId = base64.encode(SecureRandom(keyidByteLength).bytes); - while (getKey(keyId) != null) { - keyId = base64.encode(SecureRandom(keyidByteLength).bytes); - } + final keyId = () sync* { + for (;;) { + yield base64.encode(SecureRandom(keyidByteLength).bytes); + } + }() + .firstWhere((keyId) => getKey(keyId) == null); final accountDataType = EventTypes.secretStorageKey(keyId); // noooow we set the account data @@ -553,11 +545,7 @@ class SSSS { return null; } if (data.content['encrypted'] is Map) { - final Set keys = {}; - for (final key in data.content['encrypted'].keys) { - keys.add(key); - } - return keys; + return data.content['encrypted'].keys.toSet(); } return null; } diff --git a/lib/src/client.dart b/lib/src/client.dart index 5001b68d..e0428782 100644 --- a/lib/src/client.dart +++ b/lib/src/client.dart @@ -227,15 +227,15 @@ class Client extends MatrixApi { } Room getRoomByAlias(String alias) { - for (var i = 0; i < rooms.length; i++) { - if (rooms[i].canonicalAlias == alias) return rooms[i]; + for (final room in rooms) { + if (room.canonicalAlias == alias) return room; } return null; } Room getRoomById(String id) { - for (var j = 0; j < rooms.length; j++) { - if (rooms[j].id == id) return rooms[j]; + for (final room in rooms) { + if (room.id == id) return room; } return null; } @@ -269,15 +269,12 @@ class Client extends MatrixApi { .id; } } - for (var i = 0; i < rooms.length; i++) { - if (rooms[i].membership == Membership.invite && - rooms[i].getState(EventTypes.RoomMember, userID)?.senderId == - userId && - rooms[i] - .getState(EventTypes.RoomMember, userID) - .content['is_direct'] == + for (final room in rooms) { + if (room.membership == Membership.invite && + room.getState(EventTypes.RoomMember, userID)?.senderId == userId && + room.getState(EventTypes.RoomMember, userID).content['is_direct'] == true) { - return rooms[i].id; + return room.id; } } return null; @@ -1216,23 +1213,23 @@ class Client extends MatrixApi { } Future _handleEphemerals(String id, List events) async { - for (num i = 0; i < events.length; i++) { - await _handleEvent(events[i], id, EventUpdateType.ephemeral); + for (final event in events) { + await _handleEvent(event, id, EventUpdateType.ephemeral); // Receipt events are deltas between two states. We will create a // fake room account data event for this and store the difference // there. - if (events[i]['type'] == 'm.receipt') { + if (event['type'] == 'm.receipt') { var room = getRoomById(id); room ??= Room(id: id); var receiptStateContent = room.roomAccountData['m.receipt']?.content ?? {}; - for (var eventEntry in events[i]['content'].entries) { + for (var eventEntry in event['content'].entries) { final String eventID = eventEntry.key; - if (events[i]['content'][eventID]['m.read'] != null) { + if (event['content'][eventID]['m.read'] != null) { final Map userTimestampMap = - events[i]['content'][eventID]['m.read']; + event['content'][eventID]['m.read']; for (var userTimestampMapEntry in userTimestampMap.entries) { final mxid = userTimestampMapEntry.key; @@ -1253,8 +1250,8 @@ class Client extends MatrixApi { } } } - events[i]['content'] = receiptStateContent; - await _handleEvent(events[i], id, EventUpdateType.accountData); + event['content'] = receiptStateContent; + await _handleEvent(event, id, EventUpdateType.accountData); } } } @@ -1262,8 +1259,8 @@ class Client extends MatrixApi { Future _handleRoomEvents( String chat_id, List events, EventUpdateType type, {bool sortAtTheEnd = false}) async { - for (num i = 0; i < events.length; i++) { - await _handleEvent(events[i], chat_id, type, sortAtTheEnd: sortAtTheEnd); + for (final event in events) { + await _handleEvent(event, chat_id, type, sortAtTheEnd: sortAtTheEnd); } } @@ -1490,10 +1487,10 @@ sort order of ${prevState.sortOrder}. This should never happen...'''); Future> _getUserIdsInEncryptedRooms() async { var userIds = {}; - for (var i = 0; i < rooms.length; i++) { - if (rooms[i].encrypted) { + for (final room in rooms) { + if (room.encrypted) { try { - var userList = await rooms[i].requestParticipants(); + var userList = await room.requestParticipants(); for (var user in userList) { if ([Membership.join, Membership.invite] .contains(user.membership)) { @@ -1872,9 +1869,9 @@ sort order of ${prevState.sortOrder}. This should never happen...'''); if (globalPushRules == null) return false; if (globalPushRules['override'] is List) { - for (var i = 0; i < globalPushRules['override'].length; i++) { - if (globalPushRules['override'][i]['rule_id'] == '.m.rule.master') { - return globalPushRules['override'][i]['enabled']; + for (final pushRule in globalPushRules['override']) { + if (pushRule['rule_id'] == '.m.rule.master') { + return pushRule['enabled']; } } } diff --git a/lib/src/database/database.dart b/lib/src/database/database.dart index be00a479..581f2287 100644 --- a/lib/src/database/database.dart +++ b/lib/src/database/database.dart @@ -679,20 +679,12 @@ class Database extends _$Database { Future> getUsers(int clientId, sdk.Room room) async { final res = await dbGetUsers(clientId, room.id).get(); - final ret = []; - for (final r in res) { - ret.add(sdk.Event.fromDb(r, room).asUser); - } - return ret; + return res.map((r) => sdk.Event.fromDb(r, room).asUser).toList(); } Future> getEventList(int clientId, sdk.Room room) async { final res = await dbGetEventList(clientId, room.id).get(); - final eventList = []; - for (final r in res) { - eventList.add(sdk.Event.fromDb(r, room)); - } - return eventList; + return res.map((r) => sdk.Event.fromDb(r, room)).toList(); } Future getFile(String mxcUri) async { diff --git a/lib/src/event.dart b/lib/src/event.dart index 3ea5d49a..4cfaaf59 100644 --- a/lib/src/event.dart +++ b/lib/src/event.dart @@ -274,13 +274,7 @@ class Event extends MatrixEvent { default: break; } - var toRemoveList = []; - for (var entry in content.entries) { - if (!contentKeyWhiteList.contains(entry.key)) { - toRemoveList.add(entry.key); - } - } - toRemoveList.forEach((s) => content.remove(s)); + content.removeWhere((k, v) => !contentKeyWhiteList.contains(k)); } /// Returns the body of this event if it has a body. diff --git a/lib/src/room.dart b/lib/src/room.dart index ed9bc9e6..521fbdf1 100644 --- a/lib/src/room.dart +++ b/lib/src/room.dart @@ -262,13 +262,8 @@ class Room { } if (client.directChats is Map) { client.directChats.forEach((String userId, dynamic roomIds) { - if (roomIds is List) { - for (var i = 0; i < roomIds.length; i++) { - if (roomIds[i] == id) { - returnUserId = userId; - break; - } - } + if (roomIds is List && roomIds.contains(id)) { + returnUserId = userId; } }); } @@ -323,11 +318,7 @@ class Room { List get typingUsers { if (!ephemerals.containsKey('m.typing')) return []; List typingMxid = ephemerals['m.typing'].content['user_ids']; - var typingUsers = []; - for (var i = 0; i < typingMxid.length; i++) { - typingUsers.add(getUserByMXIDSync(typingMxid[i])); - } - return typingUsers; + return typingMxid.cast().map(getUserByMXIDSync).toList(); } /// Your current client instance. @@ -384,9 +375,9 @@ class Room { } if (heroes.isNotEmpty) { var displayname = ''; - for (var i = 0; i < heroes.length; i++) { - if (heroes[i].isEmpty) continue; - displayname += getUserByMXIDSync(heroes[i]).calcDisplayname() + ', '; + for (final hero in heroes) { + if (hero.isEmpty) continue; + displayname += getUserByMXIDSync(hero).calcDisplayname() + ', '; } return displayname.substring(0, displayname.length - 2); } @@ -781,11 +772,7 @@ class Room { if (inReplyTo != null) { var replyText = '<${inReplyTo.senderId}> ' + inReplyTo.body; - var replyTextLines = replyText.split('\n'); - for (var i = 0; i < replyTextLines.length; i++) { - replyTextLines[i] = '> ' + replyTextLines[i]; - } - replyText = replyTextLines.join('\n'); + replyText = replyText.split('\n').map((line) => '> $line').join('\n'); content['format'] = 'org.matrix.custom.html'; // be sure that we strip any previous reply fallbacks final replyHtml = (inReplyTo.formattedText.isNotEmpty @@ -1465,11 +1452,9 @@ class Room { if (globalPushRules == null) return PushRuleState.notify; if (globalPushRules['override'] is List) { - for (var i = 0; i < globalPushRules['override'].length; i++) { - if (globalPushRules['override'][i]['rule_id'] == id) { - if (globalPushRules['override'][i]['actions'] - .indexOf('dont_notify') != - -1) { + for (final pushRule in globalPushRules['override']) { + if (pushRule['rule_id'] == id) { + if (pushRule['actions'].indexOf('dont_notify') != -1) { return PushRuleState.dontNotify; } break; @@ -1478,10 +1463,9 @@ class Room { } if (globalPushRules['room'] is List) { - for (var i = 0; i < globalPushRules['room'].length; i++) { - if (globalPushRules['room'][i]['rule_id'] == id) { - if (globalPushRules['room'][i]['actions'].indexOf('dont_notify') != - -1) { + for (final pushRule in globalPushRules['room']) { + if (pushRule['rule_id'] == id) { + if (pushRule['actions'].indexOf('dont_notify') != -1) { return PushRuleState.mentionsOnly; } break; diff --git a/lib/src/timeline.dart b/lib/src/timeline.dart index 34859841..8a347451 100644 --- a/lib/src/timeline.dart +++ b/lib/src/timeline.dart @@ -51,8 +51,8 @@ class Timeline { /// found, requests from the server. Requested events /// are cached. Future getEventById(String id) async { - for (var i = 0; i < events.length; i++) { - if (events[i].eventId == id) return events[i]; + for (final event in events) { + if (event.eventId == id) return event; } if (_eventCache.containsKey(id)) return _eventCache[id]; final requestedEvent = await room.getEventById(id);