twonly-app/lib/src/services/api/client2client/messages.c2c.dart
2026-04-21 17:29:01 +02:00

66 lines
2 KiB
Dart

import 'package:twonly/locator.dart';
import 'package:twonly/src/model/protobuf/client/generated/messages.pb.dart';
import 'package:twonly/src/services/api/utils.api.dart';
import 'package:twonly/src/utils/log.dart';
Future<void> handleMessageUpdate(
int contactId,
EncryptedContent_MessageUpdate messageUpdate,
) async {
switch (messageUpdate.type) {
case EncryptedContent_MessageUpdate_Type.OPENED:
Log.info(
'Opened message ${messageUpdate.multipleTargetMessageIds}',
);
try {
await twonlyDB.messagesDao.handleMessagesOpened(
contactId,
messageUpdate.multipleTargetMessageIds,
fromTimestamp(messageUpdate.timestamp),
);
} catch (e) {
Log.warn(e);
}
case EncryptedContent_MessageUpdate_Type.DELETE:
if (!await isSender(contactId, messageUpdate.senderMessageId)) {
return;
}
Log.info('Delete message ${messageUpdate.senderMessageId}');
try {
await twonlyDB.messagesDao.handleMessageDeletion(
contactId,
messageUpdate.senderMessageId,
fromTimestamp(messageUpdate.timestamp),
);
} catch (e) {
Log.warn(e);
}
case EncryptedContent_MessageUpdate_Type.EDIT_TEXT:
if (!await isSender(contactId, messageUpdate.senderMessageId)) {
return;
}
Log.info('Edit message ${messageUpdate.senderMessageId}');
try {
await twonlyDB.messagesDao.handleTextEdit(
contactId,
messageUpdate.senderMessageId,
messageUpdate.text,
fromTimestamp(messageUpdate.timestamp),
);
} catch (e) {
Log.warn(e);
}
}
}
Future<bool> isSender(int fromUserId, String messageId) async {
final message = await twonlyDB.messagesDao
.getMessageById(messageId)
.getSingleOrNull();
if (message == null) return false;
if (message.senderId == fromUserId) {
return true;
}
Log.error('Contact $fromUserId tried to modify the message $messageId');
return false;
}