From c7826ad6ddf658caaccd5e6e69b28e6619ac4390 Mon Sep 17 00:00:00 2001 From: otsmr Date: Tue, 26 May 2026 11:57:59 +0200 Subject: [PATCH] improve logging --- lib/src/database/daos/messages.dao.dart | 50 +++++++++---------- lib/src/database/daos/reactions.dao.dart | 9 +++- .../api/client2client/reaction.c2c.dart | 5 +- lib/src/services/api/messages.api.dart | 33 +++++++++++- .../camera_preview_controller_view.dart | 2 + .../message_send_state_icon.dart | 10 ++-- pubspec.yaml | 2 +- 7 files changed, 77 insertions(+), 34 deletions(-) diff --git a/lib/src/database/daos/messages.dao.dart b/lib/src/database/daos/messages.dao.dart index d794b8cf..ff1e0a64 100644 --- a/lib/src/database/daos/messages.dao.dart +++ b/lib/src/database/daos/messages.dao.dart @@ -253,23 +253,19 @@ class MessagesDao extends DatabaseAccessor with _$MessagesDaoMixin { List messageIds, DateTime timestamp, ) async { - try { - await twonlyDB.batch((batch) async { - for (final messageId in messageIds) { - batch.insert( - messageActions, - MessageActionsCompanion( - messageId: Value(messageId), - contactId: contactId, - type: const Value(MessageActionType.openedAt), - actionAt: Value(timestamp), - ), - mode: InsertMode.insertOrReplace, - ); - } - }); - } catch (e) { - Log.error(e); + for (final messageId in messageIds) { + try { + await into(messageActions).insertOnConflictUpdate( + MessageActionsCompanion( + messageId: Value(messageId), + contactId: contactId, + type: const Value(MessageActionType.openedAt), + actionAt: Value(timestamp), + ), + ); + } catch (e) { + Log.error('handleMessagesOpened insert failed for $messageId: $e'); + } } for (final messageId in messageIds) { @@ -278,16 +274,20 @@ class MessagesDao extends DatabaseAccessor with _$MessagesDaoMixin { messageId, MessageActionType.openedAt, ); - await (update( - messages, - )..where((tbl) => tbl.messageId.equals(messageId))).write( - MessagesCompanion( - openedAt: Value(timestamp), - openedByAll: Value(isOpenedByAll ? timestamp : null), - ), + final rowsUpdated = + await (update( + messages, + )..where((tbl) => tbl.messageId.equals(messageId))).write( + MessagesCompanion( + openedAt: Value(timestamp), + openedByAll: Value(isOpenedByAll ? timestamp : null), + ), + ); + Log.info( + 'handleMessagesOpened updated $rowsUpdated rows for message $messageId', ); } catch (e) { - Log.error(e); + Log.error('handleMessagesOpened update failed: $e'); } } } diff --git a/lib/src/database/daos/reactions.dao.dart b/lib/src/database/daos/reactions.dao.dart index bd1405b3..a54deb20 100644 --- a/lib/src/database/daos/reactions.dao.dart +++ b/lib/src/database/daos/reactions.dao.dart @@ -29,7 +29,14 @@ class ReactionsDao extends DatabaseAccessor with _$ReactionsDaoMixin { final msg = await twonlyDB.messagesDao .getMessageById(messageId) .getSingleOrNull(); - if (msg == null || msg.groupId != groupId) return; + if (msg == null) { + Log.error('updateReaction: Message $messageId not found!'); + return; + } + if (msg.groupId != groupId) { + Log.error('updateReaction: Message groupId ${msg.groupId} != $groupId'); + return; + } try { if (remove) { diff --git a/lib/src/services/api/client2client/reaction.c2c.dart b/lib/src/services/api/client2client/reaction.c2c.dart index 7988e55b..03a423c1 100644 --- a/lib/src/services/api/client2client/reaction.c2c.dart +++ b/lib/src/services/api/client2client/reaction.c2c.dart @@ -10,7 +10,10 @@ Future handleReaction( EncryptedContent_Reaction reaction, String receiptId, ) async { - Log.info('[$receiptId] Got a reaction from $fromUserId (remove=${reaction.remove})'); + Log.info( + '[$receiptId] Got a reaction from for ${reaction.targetMessageId} (remove=${reaction.remove})', + ); + await twonlyDB.reactionsDao.updateReaction( fromUserId, reaction.targetMessageId, diff --git a/lib/src/services/api/messages.api.dart b/lib/src/services/api/messages.api.dart index 7d26da32..29a234fe 100644 --- a/lib/src/services/api/messages.api.dart +++ b/lib/src/services/api/messages.api.dart @@ -350,7 +350,9 @@ Future insertAndSendAskAboutUserMessage( ) async { final directChat = await twonlyDB.groupsDao.createOrGetDirectChat(contactId); if (directChat == null) { - Log.error('Failed to get or create direct chat group for contact $contactId'); + Log.error( + 'Failed to get or create direct chat group for contact $contactId', + ); return; } @@ -483,6 +485,17 @@ Future<(Uint8List, Uint8List?)?> sendCipherText( ); if (receipt != null) { + try { + final typeKeys = _getEncryptedContentTypes(encryptedContent); + Log.info( + 'sendCipherText: type=[$typeKeys] messageId=$messageId receiptId=${receipt.receiptId}', + ); + } catch (_) { + Log.info( + 'sendCipherText: messageId=$messageId receiptId=${receipt.receiptId}', + ); + } + final tmp = tryToSendCompleteMessage( receipt: receipt, onlyReturnEncryptedData: onlyReturnEncryptedData, @@ -568,3 +581,21 @@ Future sendContactMyProfileData(int contactId) async { ); await sendCipherText(contactId, encryptedContent, blocking: false); } + +String _getEncryptedContentTypes(pb.EncryptedContent content) { + final ignoredFields = { + 'groupId', + 'isDirectChat', + 'senderProfileCounter', + 'senderUserDiscoveryVersion', + }; + + final types = []; + for (final field in content.info_.byName.values) { + if (content.hasField(field.tagNumber) && + !ignoredFields.contains(field.name)) { + types.add(field.name); + } + } + return types.join(', '); +} diff --git a/lib/src/visual/views/camera/camera_preview_components/camera_preview_controller_view.dart b/lib/src/visual/views/camera/camera_preview_components/camera_preview_controller_view.dart index 1a3e52a3..6f638aa6 100644 --- a/lib/src/visual/views/camera/camera_preview_components/camera_preview_controller_view.dart +++ b/lib/src/visual/views/camera/camera_preview_components/camera_preview_controller_view.dart @@ -212,6 +212,7 @@ class _CameraPreviewViewState extends State { // Maybe this is the reason? return; } else { + await androidVolumeDownSub?.cancel(); androidVolumeDownSub = FlutterAndroidVolumeKeydown.stream.listen(( event, ) { @@ -233,6 +234,7 @@ class _CameraPreviewViewState extends State { } if (Platform.isAndroid) { await androidVolumeDownSub?.cancel(); + androidVolumeDownSub = null; } } diff --git a/lib/src/visual/views/chats/chat_messages_components/message_send_state_icon.dart b/lib/src/visual/views/chats/chat_messages_components/message_send_state_icon.dart index 1d35e52f..9df84bbb 100644 --- a/lib/src/visual/views/chats/chat_messages_components/message_send_state_icon.dart +++ b/lib/src/visual/views/chats/chat_messages_components/message_send_state_icon.dart @@ -24,15 +24,15 @@ enum MessageSendState { MessageSendState messageSendStateFromMessage(Message msg) { if (msg.senderId == null) { + if (msg.openedByAll != null || msg.openedAt != null) { + return MessageSendState.sendOpened; + } + /// messages was send by me, look up if every messages was received by the server... if (msg.ackByServer == null) { return MessageSendState.sending; } - if (msg.openedAt != null) { - return MessageSendState.sendOpened; - } else { - return MessageSendState.send; - } + return MessageSendState.send; } // message received diff --git a/pubspec.yaml b/pubspec.yaml index fd9437ed..8c4fb1ad 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -3,7 +3,7 @@ description: "twonly, a privacy-friendly way to connect with friends through sec publish_to: 'none' -version: 0.2.20+129 +version: 0.2.21+130 environment: sdk: ^3.11.0