add new numbers to the user_studies

This commit is contained in:
otsmr 2026-04-22 14:33:15 +02:00
parent 50679ce9ed
commit 4a8fbdce28
3 changed files with 79 additions and 1 deletions

View file

@ -146,6 +146,18 @@ class ContactsDao extends DatabaseAccessor<TwonlyDB> with _$ContactsDaoMixin {
.watch(); .watch();
} }
Future<List<Contact>> getContactsAnnouncedViaUserDiscovery() async {
return (select(contacts)..where(
(t) =>
t.userDiscoveryVersion.isNotNull() &
t.userDiscoveryExcluded.equals(false) &
t.mediaSendCounter.isBiggerOrEqualValue(
userService.currentUser.minimumRequiredImagesExchanged,
),
))
.get();
}
Stream<List<Contact>> watchAllContacts() { Stream<List<Contact>> watchAllContacts() {
return select(contacts).watch(); return select(contacts).watch();
} }

View file

@ -51,6 +51,46 @@ class UserDiscoveryDao extends DatabaseAccessor<TwonlyDB>
.toList(); .toList();
} }
Future<AnnouncedUsersWithRelations>
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<AnnouncedUsersWithRelations> watchAllAnnouncedUsersWithRelations() { Stream<AnnouncedUsersWithRelations> watchAllAnnouncedUsersWithRelations() {
final query = select(userDiscoveryAnnouncedUsers).join([ final query = select(userDiscoveryAnnouncedUsers).join([
innerJoin( innerJoin(

View file

@ -10,7 +10,7 @@ import 'package:twonly/src/utils/misc.dart';
const userStudySurveyKey = 'user_study_survey'; 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. :/ // You're just making my master's thesis more difficult and destroy scientific data. :/
const surveyUrlBase = 'https://survey.twonly.org/upload.php'; const surveyUrlBase = 'https://survey.twonly.org/upload.php';
@ -47,8 +47,34 @@ Future<void> handleUserStudyUpload() async {
final verifications = await twonlyDB.keyVerificationDao final verifications = await twonlyDB.keyVerificationDao
.getFirstVerificationTypeByContacts(); .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 = { final dataCollection = {
'total_contacts': contacts.length, '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, 'accepted_contacts': contacts.where((c) => c.accepted).length,
'verified_contacts': verifications.length, 'verified_contacts': verifications.length,
'verified_contacts_via_migrated_from_old_version': verifications.values 'verified_contacts_via_migrated_from_old_version': verifications.values