twonly-app/lib/src/services/flame.service.dart
2025-10-25 01:08:59 +02:00

63 lines
2.1 KiB
Dart

import 'package:collection/collection.dart';
import 'package:drift/drift.dart';
import 'package:fixnum/fixnum.dart';
import 'package:twonly/globals.dart';
import 'package:twonly/src/database/daos/groups.dao.dart';
import 'package:twonly/src/database/twonly.db.dart';
import 'package:twonly/src/model/protobuf/client/generated/messages.pb.dart';
import 'package:twonly/src/services/api/messages.dart';
import 'package:twonly/src/utils/misc.dart';
import 'package:twonly/src/utils/storage.dart';
Future<void> syncFlameCounters() async {
final groups = await twonlyDB.groupsDao.getAllDirectChats();
if (groups.isEmpty) return;
final maxMessageCounter = groups.map((x) => x.totalMediaCounter).max;
final bestFriend =
groups.firstWhere((x) => x.totalMediaCounter == maxMessageCounter);
if (gUser.myBestFriendGroupId != bestFriend.groupId) {
await updateUserdata((user) {
user.myBestFriendGroupId = bestFriend.groupId;
return user;
});
}
for (final group in groups) {
if (group.lastFlameCounterChange == null) continue;
if (!isToday(group.lastFlameCounterChange!)) continue;
if (group.lastFlameSync != null) {
if (isToday(group.lastFlameSync!)) continue;
}
final flameCounter = getFlameCounterFromGroup(group) - 1;
// only sync when flame counter is higher than three days or when they are bestFriends
if (flameCounter < 1 && bestFriend.groupId != group.groupId) continue;
final groupMembers =
await twonlyDB.groupsDao.getGroupMembers(group.groupId);
if (groupMembers.length != 1) {
continue; // flame sync is only done for groups of two
}
await sendCipherText(
groupMembers.first.contactId,
EncryptedContent(
flameSync: EncryptedContent_FlameSync(
flameCounter: Int64(flameCounter),
lastFlameCounterChange:
Int64(group.lastFlameCounterChange!.millisecondsSinceEpoch),
bestFriend: group.groupId == bestFriend.groupId,
),
),
);
await twonlyDB.groupsDao.updateGroup(
group.groupId,
GroupsCompanion(
lastFlameSync: Value(DateTime.now()),
),
);
}
}