fluffychat/lib/pangea/user/analytics_profile_model.dart
Kelrap 711ae38f4a
Model key cleanup (#4983)
* refactor: Group redundant ModelKey entries

* Add python script to find and replace hardcoded ModelKey values

* Edited Python script to not automatically use ModelKey for files not
already using it

* refactor: Ran script and accepted obvious changes

* rename 'duration' model key

---------

Co-authored-by: ggurdin <ggurdin@gmail.com>
2025-12-31 09:26:06 -05:00

151 lines
4.5 KiB
Dart

import 'package:fluffychat/pangea/common/constants/model_keys.dart';
import 'package:fluffychat/pangea/events/constants/pangea_event_types.dart';
import 'package:fluffychat/pangea/languages/language_model.dart';
import 'package:fluffychat/pangea/languages/p_language_store.dart';
class AnalyticsProfileModel {
LanguageModel? baseLanguage;
LanguageModel? targetLanguage;
Map<LanguageModel, LanguageAnalyticsProfileEntry>? languageAnalytics;
AnalyticsProfileModel({
this.baseLanguage,
this.targetLanguage,
this.languageAnalytics,
});
factory AnalyticsProfileModel.fromJson(Map<String, dynamic> json) {
if (!json.containsKey(PangeaEventTypes.profileAnalytics)) {
return AnalyticsProfileModel();
}
final profileJson = json[PangeaEventTypes.profileAnalytics];
final baseLanguage = profileJson[ModelKey.sourceLanguage] != null
? PLanguageStore.byLangCode(profileJson[ModelKey.sourceLanguage])
: null;
final targetLanguage = profileJson[ModelKey.targetLanguage] != null
? PLanguageStore.byLangCode(profileJson[ModelKey.targetLanguage])
: null;
final languageAnalytics = <LanguageModel, LanguageAnalyticsProfileEntry>{};
if (profileJson[ModelKey.analytics] != null &&
profileJson[ModelKey.analytics]!.isNotEmpty) {
for (final entry in profileJson[ModelKey.analytics].entries) {
final lang = PLanguageStore.byLangCode(entry.key);
if (lang == null) continue;
final level = entry.value[ModelKey.level];
final xpOffset = entry.value[ModelKey.xpOffset] ?? 0;
final analyticsRoomId =
entry.value[ModelKey.analyticsRoomId] as String?;
languageAnalytics[lang] = LanguageAnalyticsProfileEntry(
level,
xpOffset,
analyticsRoomId: analyticsRoomId,
);
}
}
final profile = AnalyticsProfileModel(
baseLanguage: baseLanguage,
targetLanguage: targetLanguage,
languageAnalytics: languageAnalytics,
);
return profile;
}
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
if (targetLanguage != null) {
json[ModelKey.targetLanguage] = targetLanguage!.langCodeShort;
}
if (baseLanguage != null) {
json[ModelKey.sourceLanguage] = baseLanguage!.langCodeShort;
}
final analytics = {};
if (languageAnalytics != null && languageAnalytics!.isNotEmpty) {
for (final entry in languageAnalytics!.entries) {
analytics[entry.key.langCode] = {
ModelKey.level: entry.value.level,
ModelKey.xpOffset: entry.value.xpOffset,
if (entry.value.analyticsRoomId != null)
ModelKey.analyticsRoomId: entry.value.analyticsRoomId,
};
}
}
json[ModelKey.analytics] = analytics;
return json;
}
bool get isEmpty =>
baseLanguage == null ||
targetLanguage == null ||
(languageAnalytics == null || languageAnalytics!.isEmpty);
String? analyticsRoomIdByLanguage(LanguageModel language) =>
languageAnalytics![language]?.analyticsRoomId;
/// Set the level and analytics room ID for the a given language.
void setLanguageInfo(
LanguageModel language,
int level,
String? analyticsRoomId,
) {
languageAnalytics ??= {};
languageAnalytics![language] ??= LanguageAnalyticsProfileEntry(
0,
0,
analyticsRoomId: analyticsRoomId,
);
if (languageAnalytics![language]!.level < level) {
languageAnalytics![language]!.level = level;
}
final currentRoomId = analyticsRoomIdByLanguage(language);
if (currentRoomId != analyticsRoomId) {
languageAnalytics![language]!.analyticsRoomId = analyticsRoomId;
}
languageAnalytics![language]!.level = level;
}
void addXPOffset(
LanguageModel language,
int xpOffset,
String? analyticsRoomId,
) {
languageAnalytics ??= {};
languageAnalytics![language] ??= LanguageAnalyticsProfileEntry(
0,
0,
analyticsRoomId: analyticsRoomId,
);
final currentRoomId = analyticsRoomIdByLanguage(language);
if (currentRoomId == null) {
languageAnalytics![language]!.analyticsRoomId = analyticsRoomId;
}
languageAnalytics![language]!.xpOffset += xpOffset;
}
int? get level => languageAnalytics?[targetLanguage]?.level;
int? get xpOffset => languageAnalytics?[targetLanguage]?.xpOffset;
}
class LanguageAnalyticsProfileEntry {
int level;
int xpOffset = 0;
String? analyticsRoomId;
LanguageAnalyticsProfileEntry(
this.level,
this.xpOffset, {
this.analyticsRoomId,
});
}