improve user discovery new message handling

This commit is contained in:
otsmr 2026-04-26 10:43:25 +02:00
parent ce60f4e2f1
commit c9aa680243
2 changed files with 28 additions and 6 deletions

View file

@ -6,6 +6,8 @@ import 'package:twonly/src/services/api/messages.api.dart';
import 'package:twonly/src/services/user_discovery.service.dart'; import 'package:twonly/src/services/user_discovery.service.dart';
import 'package:twonly/src/utils/log.dart'; import 'package:twonly/src/utils/log.dart';
final _requestedUpdates = <int>{};
Future<void> checkForUserDiscoveryChanges( Future<void> checkForUserDiscoveryChanges(
int fromUserId, int fromUserId,
List<int> receivedVersion, List<int> receivedVersion,
@ -16,7 +18,12 @@ Future<void> checkForUserDiscoveryChanges(
); );
if (currentVersion != null) { if (currentVersion != null) {
if (_requestedUpdates.contains(fromUserId)) {
/// Only request a new version once per app session
return;
}
Log.info('Having old version from contact. Requesting new version.'); Log.info('Having old version from contact. Requesting new version.');
_requestedUpdates.add(fromUserId);
await sendCipherText( await sendCipherText(
fromUserId, fromUserId,
EncryptedContent( EncryptedContent(

View file

@ -216,14 +216,31 @@ impl<Store: UserDiscoveryStore, Utils: UserDiscoveryUtils> UserDiscovery<Store,
} }
if received_version.promotion < config.promotion_version { if received_version.promotion < config.promotion_version {
tracing::info!("New promotion message available for user {}", contact_id); tracing::info!("New promotion message available for user {}", contact_id);
let promoting_messages: Vec<Vec<u8>> = self let promoting_messages = self
.store .store
.get_own_promotions_after_version(received_version.promotion) .get_own_promotions_after_version(received_version.promotion)
.await? .await?;
let size = promoting_messages.len();
let mut filtered: Vec<Vec<u8>> = promoting_messages
.into_iter() .into_iter()
.filter(|x| !x.is_empty()) // filter ignored versions .filter(|x| !x.is_empty()) // filter ignored versions
.collect(); .collect();
messages.extend_from_slice(&promoting_messages);
if filtered.len() != size {
// ensure the receiver will get the later version in case the last message was filtered out
filtered.push(
UserDiscoveryMessage {
version: Some(UserDiscoveryVersion {
announcement: config.announcement_version,
promotion: config.promotion_version,
}),
..Default::default()
}
.encode_to_vec(),
);
}
messages.extend_from_slice(&filtered);
} }
Ok(messages) Ok(messages)
} }
@ -307,11 +324,9 @@ impl<Store: UserDiscoveryStore, Utils: UserDiscoveryUtils> UserDiscovery<Store,
if let Err(err) = self.handle_user_discovery_promotion(contact_id, udp).await { if let Err(err) = self.handle_user_discovery_promotion(contact_id, udp).await {
tracing::warn!("Ignoring: {err}"); tracing::warn!("Ignoring: {err}");
} }
} else {
tracing::info!("Got unknown user discovery messaging. Ignoring it.");
continue;
} }
// Always update the version...
self.store self.store
.set_contact_version(contact_id, version.encode_to_vec()) .set_contact_version(contact_id, version.encode_to_vec())
.await?; .await?;