twonly-app/lib/src/services/api/client2client/text_message.c2c.dart
2026-04-22 19:47:43 +02:00

52 lines
1.7 KiB
Dart

import 'package:clock/clock.dart';
import 'package:drift/drift.dart';
import 'package:twonly/locator.dart';
import 'package:twonly/src/database/tables/messages.table.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/utils.api.dart';
import 'package:twonly/src/utils/log.dart';
Future<void> handleTextMessage(
int fromUserId,
String groupId,
EncryptedContent_TextMessage textMessage,
) async {
Log.info(
'Got a text message: ${textMessage.senderMessageId} from $groupId',
);
// Prevent message overwrite: reject if a message with this ID already
// exists from a different sender.
final existing = await twonlyDB.messagesDao
.getMessageById(textMessage.senderMessageId)
.getSingleOrNull();
if (existing != null && existing.senderId != fromUserId) {
Log.warn(
'$fromUserId tried to overwrite message from ${existing.senderId}. Dropping.',
);
return;
}
final message = await twonlyDB.messagesDao.insertMessage(
MessagesCompanion(
messageId: Value(textMessage.senderMessageId),
senderId: Value(fromUserId),
groupId: Value(groupId),
content: Value(textMessage.text),
type: Value(MessageType.text.name),
quotesMessageId: Value(
textMessage.hasQuoteMessageId() ? textMessage.quoteMessageId : null,
),
createdAt: Value(fromTimestamp(textMessage.timestamp)),
ackByServer: Value(clock.now()),
),
);
await twonlyDB.groupsDao.increaseLastMessageExchange(
groupId,
fromTimestamp(textMessage.timestamp),
);
if (message != null) {
Log.info('Inserted a new text message with ID: ${message.messageId}');
}
}