From 60ed2775bbb2eabf3656d73a3fe8752476daf06d Mon Sep 17 00:00:00 2001 From: otsmr Date: Sat, 14 Mar 2026 01:40:07 +0100 Subject: [PATCH] Groups can now collect flames as well --- CHANGELOG.md | 1 + lib/src/database/daos/groups.dao.dart | 4 ++++ lib/src/services/api/client2client/contact.c2c.dart | 6 +++--- lib/src/services/api/server_messages.dart | 10 +++++----- lib/src/services/flame.service.dart | 12 +++--------- lib/src/views/components/flame.dart | 4 ---- lib/src/views/groups/group.view.dart | 5 +++++ 7 files changed, 21 insertions(+), 21 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cfbbdc0..5ac67b2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## 0.0.98 +- New: Groups can now collect flames as well - New: Adds a link if the image contains a QR code - Improve: Video compression with progress updates - Improve: Show message "Flames restored" diff --git a/lib/src/database/daos/groups.dao.dart b/lib/src/database/daos/groups.dao.dart index 6821bb8..ad327c9 100644 --- a/lib/src/database/daos/groups.dao.dart +++ b/lib/src/database/daos/groups.dao.dart @@ -248,6 +248,10 @@ class GroupsDao extends DatabaseAccessor with _$GroupsDaoMixin { return (select(groups)..where((t) => t.isDirectChat.equals(true))).get(); } + Future> getAllGroups() { + return select(groups).get(); + } + Future> getAllNotJoinedGroups() { return (select(groups) ..where( diff --git a/lib/src/services/api/client2client/contact.c2c.dart b/lib/src/services/api/client2client/contact.c2c.dart index e9581ce..217b745 100644 --- a/lib/src/services/api/client2client/contact.c2c.dart +++ b/lib/src/services/api/client2client/contact.c2c.dart @@ -137,12 +137,12 @@ Future handleContactUpdate( } Future handleFlameSync( - int contactId, + String groupId, EncryptedContent_FlameSync flameSync, ) async { - Log.info('Got a flameSync from $contactId'); + Log.info('Got a flameSync for group $groupId'); - final group = await twonlyDB.groupsDao.getDirectChat(contactId); + final group = await twonlyDB.groupsDao.getGroup(groupId); if (group == null || group.lastFlameCounterChange == null) return; var updates = GroupsCompanion( diff --git a/lib/src/services/api/server_messages.dart b/lib/src/services/api/server_messages.dart index af5bbd3..2914d4e 100644 --- a/lib/src/services/api/server_messages.dart +++ b/lib/src/services/api/server_messages.dart @@ -257,11 +257,6 @@ Future<(EncryptedContent?, PlaintextContent?)> handleEncryptedMessage( return (null, null); } - if (content.hasFlameSync()) { - await handleFlameSync(fromUserId, content.flameSync); - return (null, null); - } - if (content.hasPushKeys()) { await handlePushKey(fromUserId, content.pushKeys); return (null, null); @@ -346,6 +341,11 @@ Future<(EncryptedContent?, PlaintextContent?)> handleEncryptedMessage( } } + if (content.hasFlameSync()) { + await handleFlameSync(content.groupId, content.flameSync); + return (null, null); + } + if (content.hasGroupUpdate()) { await handleGroupUpdate( fromUserId, diff --git a/lib/src/services/flame.service.dart b/lib/src/services/flame.service.dart index ff98bd1..9ef17b8 100644 --- a/lib/src/services/flame.service.dart +++ b/lib/src/services/flame.service.dart @@ -10,7 +10,7 @@ import 'package:twonly/src/utils/misc.dart'; import 'package:twonly/src/utils/storage.dart'; Future syncFlameCounters({String? forceForGroup}) async { - final groups = await twonlyDB.groupsDao.getAllDirectChats(); + final groups = await twonlyDB.groupsDao.getAllGroups(); if (groups.isEmpty) return; final maxMessageCounter = groups.map((x) => x.totalMediaCounter).max; final bestFriend = @@ -37,14 +37,8 @@ Future syncFlameCounters({String? forceForGroup}) async { // only sync when flame counter is higher three or when they are bestFriends if (flameCounter <= 2 && bestFriend.groupId != group.groupId) continue; - final groupMembers = - await twonlyDB.groupsDao.getGroupNonLeftMembers(group.groupId); - if (groupMembers.length != 1) { - continue; // flame sync is only done for groups of two - } - - await sendCipherText( - groupMembers.first.contactId, + await sendCipherTextToGroup( + group.groupId, EncryptedContent( flameSync: EncryptedContent_FlameSync( flameCounter: Int64(flameCounter), diff --git a/lib/src/views/components/flame.dart b/lib/src/views/components/flame.dart index d4c42c7..07dae00 100644 --- a/lib/src/views/components/flame.dart +++ b/lib/src/views/components/flame.dart @@ -44,11 +44,7 @@ class _FlameCounterWidgetState extends State { group = await twonlyDB.groupsDao.getDirectChat(widget.contactId!); groupId = group?.groupId; } else if (groupId != null) { - // do not display the flame counter for groups group = await twonlyDB.groupsDao.getGroup(groupId); - if (!(group?.isDirectChat ?? false)) { - return; - } } if (groupId != null && group != null) { isBestFriend = diff --git a/lib/src/views/groups/group.view.dart b/lib/src/views/groups/group.view.dart index 8f56bda..88220c4 100644 --- a/lib/src/views/groups/group.view.dart +++ b/lib/src/views/groups/group.view.dart @@ -11,6 +11,7 @@ import 'package:twonly/src/utils/misc.dart'; import 'package:twonly/src/views/components/alert_dialog.dart'; import 'package:twonly/src/views/components/avatar_icon.component.dart'; import 'package:twonly/src/views/components/better_list_title.dart'; +import 'package:twonly/src/views/components/flame.dart'; import 'package:twonly/src/views/components/select_chat_deletion_time.comp.dart'; import 'package:twonly/src/views/components/verified_shield.dart'; import 'package:twonly/src/views/contact/contact.view.dart'; @@ -181,6 +182,10 @@ class _GroupViewState extends State { substringBy(_group!.groupName, 25), style: const TextStyle(fontSize: 20), ), + FlameCounterWidget( + groupId: _group?.groupId, + prefix: true, + ), ], ), const SizedBox(height: 50),