From 4a8fbdce28fc6f3151dc80f9a6a9d61eda7b320c Mon Sep 17 00:00:00 2001 From: otsmr Date: Wed, 22 Apr 2026 14:33:15 +0200 Subject: [PATCH] add new numbers to the user_studies --- lib/src/database/daos/contacts.dao.dart | 12 ++++++ lib/src/database/daos/user_discovery.dao.dart | 40 +++++++++++++++++++ lib/src/services/user_study.service.dart | 28 ++++++++++++- 3 files changed, 79 insertions(+), 1 deletion(-) diff --git a/lib/src/database/daos/contacts.dao.dart b/lib/src/database/daos/contacts.dao.dart index d93cacac..fd66c5b6 100644 --- a/lib/src/database/daos/contacts.dao.dart +++ b/lib/src/database/daos/contacts.dao.dart @@ -146,6 +146,18 @@ class ContactsDao extends DatabaseAccessor with _$ContactsDaoMixin { .watch(); } + Future> getContactsAnnouncedViaUserDiscovery() async { + return (select(contacts)..where( + (t) => + t.userDiscoveryVersion.isNotNull() & + t.userDiscoveryExcluded.equals(false) & + t.mediaSendCounter.isBiggerOrEqualValue( + userService.currentUser.minimumRequiredImagesExchanged, + ), + )) + .get(); + } + Stream> watchAllContacts() { return select(contacts).watch(); } diff --git a/lib/src/database/daos/user_discovery.dao.dart b/lib/src/database/daos/user_discovery.dao.dart index b602dc80..2d21c2bd 100644 --- a/lib/src/database/daos/user_discovery.dao.dart +++ b/lib/src/database/daos/user_discovery.dao.dart @@ -51,6 +51,46 @@ class UserDiscoveryDao extends DatabaseAccessor .toList(); } + Future + getAllAnnouncedUsersWithRelations() async { + final query = select(userDiscoveryAnnouncedUsers).join([ + innerJoin( + userDiscoveryUserRelations, + userDiscoveryUserRelations.announcedUserId.equalsExp( + userDiscoveryAnnouncedUsers.announcedUserId, + ), + ), + innerJoin( + contacts, + contacts.userId.equalsExp( + userDiscoveryUserRelations.fromContactId, + ), + ), + ])..where(userDiscoveryAnnouncedUsers.username.isNotNull()); + + final rows = await query.get(); + // ignore: omit_local_variable_types + final AnnouncedUsersWithRelations results = {}; + + for (final row in rows) { + final user = row.readTable(userDiscoveryAnnouncedUsers); + final relation = row.readTable(userDiscoveryUserRelations); + final contact = row.readTable(contacts); + + final relationData = ( + contact, + relation.publicKeyVerifiedTimestamp, + ); + + if (!results.containsKey(user)) { + results[user] = []; + } + results[user]!.add(relationData); + } + + return results; + } + Stream watchAllAnnouncedUsersWithRelations() { final query = select(userDiscoveryAnnouncedUsers).join([ innerJoin( diff --git a/lib/src/services/user_study.service.dart b/lib/src/services/user_study.service.dart index 7be7a341..b5d96fb6 100644 --- a/lib/src/services/user_study.service.dart +++ b/lib/src/services/user_study.service.dart @@ -10,7 +10,7 @@ import 'package:twonly/src/utils/misc.dart'; const userStudySurveyKey = 'user_study_survey'; -// LEASE DO NOT SPAM OR TRY SENDING DIRECTLY TO THIS URL! +// PLEASE DO NOT SPAM OR TRY SENDING DIRECTLY TO THIS URL! // You're just making my master's thesis more difficult and destroy scientific data. :/ const surveyUrlBase = 'https://survey.twonly.org/upload.php'; @@ -47,8 +47,34 @@ Future handleUserStudyUpload() async { final verifications = await twonlyDB.keyVerificationDao .getFirstVerificationTypeByContacts(); + final udFriendsShared = await twonlyDB.contactsDao + .getContactsAnnouncedViaUserDiscovery(); + + final udAllAnnouncedUsers = await twonlyDB.userDiscoveryDao + .getAllAnnouncedUsersWithRelations(); + + var udUnknownAnnouncedUsers = 0; + + for (final udUser in udAllAnnouncedUsers.keys) { + if (!contacts.any((c) => c.userId == udUser.announcedUserId)) { + udUnknownAnnouncedUsers += 1; + } + } + final dataCollection = { 'total_contacts': contacts.length, + + 'user_discovery_enabled': userService.currentUser.isUserDiscoveryEnabled, + 'user_discovery_minimum_images': + userService.currentUser.minimumRequiredImagesExchanged, + 'user_discovery_threshold': + userService.currentUser.userDiscoveryThreshold, + + 'user_discovery_count_friends_shared': udFriendsShared.length, + + 'user_discovery_count_announced_users': udAllAnnouncedUsers.length, + 'user_discovery_count_unknown_announced_users': udUnknownAnnouncedUsers, + 'accepted_contacts': contacts.where((c) => c.accepted).length, 'verified_contacts': verifications.length, 'verified_contacts_via_migrated_from_old_version': verifications.values