refactor: high-level loops

This commit is contained in:
Lukas Lihotzki 2021-03-30 13:55:49 +02:00
parent c248de0d04
commit 08043c06f4
6 changed files with 53 additions and 98 deletions

View File

@ -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 = <int>[];
for (final b in olmRecoveryKeyPrefix) {
keyToEncode.add(b);
}
keyToEncode.addAll(recoveryKey);
var parity = 0;
for (final b in keyToEncode) {
parity ^= b;
}
final keyToEncode = <int>[...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 = <String>{};
for (final key in data.content['encrypted'].keys) {
keys.add(key);
}
return keys;
return data.content['encrypted'].keys.toSet();
}
return null;
}

View File

@ -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<void> _handleEphemerals(String id, List<dynamic> 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<String, dynamic> 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<void> _handleRoomEvents(
String chat_id, List<dynamic> 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<Set<String>> _getUserIdsInEncryptedRooms() async {
var userIds = <String>{};
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'];
}
}
}

View File

@ -679,20 +679,12 @@ class Database extends _$Database {
Future<List<sdk.User>> getUsers(int clientId, sdk.Room room) async {
final res = await dbGetUsers(clientId, room.id).get();
final ret = <sdk.User>[];
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<List<sdk.Event>> getEventList(int clientId, sdk.Room room) async {
final res = await dbGetEventList(clientId, room.id).get();
final eventList = <sdk.Event>[];
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<Uint8List> getFile(String mxcUri) async {

View File

@ -274,13 +274,7 @@ class Event extends MatrixEvent {
default:
break;
}
var toRemoveList = <String>[];
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.

View File

@ -262,13 +262,8 @@ class Room {
}
if (client.directChats is Map<String, dynamic>) {
client.directChats.forEach((String userId, dynamic roomIds) {
if (roomIds is List<dynamic>) {
for (var i = 0; i < roomIds.length; i++) {
if (roomIds[i] == id) {
returnUserId = userId;
break;
}
}
if (roomIds is List<dynamic> && roomIds.contains(id)) {
returnUserId = userId;
}
});
}
@ -323,11 +318,7 @@ class Room {
List<User> get typingUsers {
if (!ephemerals.containsKey('m.typing')) return [];
List<dynamic> typingMxid = ephemerals['m.typing'].content['user_ids'];
var typingUsers = <User>[];
for (var i = 0; i < typingMxid.length; i++) {
typingUsers.add(getUserByMXIDSync(typingMxid[i]));
}
return typingUsers;
return typingMxid.cast<String>().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;

View File

@ -51,8 +51,8 @@ class Timeline {
/// found, requests from the server. Requested events
/// are cached.
Future<Event> 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);