getModerationPrefs method
Implementation
ModerationPrefs getModerationPrefs({
List<String> appLabelers = const [_kBskyLabelerDid],
}) {
bool adultContentEnabled = false;
final labels = <String, LabelPreference>{};
final mutedWords = <MutedWord>[];
final hiddenPosts = <String>[];
// Seed with the app labelers so that label prefs scoped to an app
// labeler attach to its entry, following the official client behavior.
final labelers = <Map<String, dynamic>>[
for (final did in appLabelers)
{'did': did, 'labels': <String, LabelPreference>{}},
];
final labelPrefs = <ContentLabelPref>[];
for (final preference in preferences) {
switch (preference) {
case UPreferencesAdultContentPref(:final data):
adultContentEnabled = data.enabled;
case UPreferencesLabelersPref(:final data):
labelers.addAll(
data.labelers.map(
(e) => {'did': e.did, 'labels': <String, LabelPreference>{}},
),
);
case UPreferencesMutedWordsPref(:final data):
mutedWords.addAll(data.items);
case UPreferencesHiddenPostsPref(:final data):
hiddenPosts.addAll(data.items.map((e) => e.toString()));
case UPreferencesContentLabelPref(:final data):
labelPrefs.add(data);
default:
break;
}
}
for (final labelPref in labelPrefs) {
final pref = _getModerationLabelPreference(labelPref.visibility.toJson());
if (labelPref.labelerDid != null) {
final labeler = labelers
.where((e) => e['did'] == labelPref.labelerDid)
.firstOrNull;
// A labeler-scoped pref only applies to the matching labeler; if the
// labeler is not subscribed, the pref is dropped and must never fall
// through to the global labels.
if (labeler == null) continue;
labeler['labels'][labelPref.label] = pref;
} else {
labels[_getModerationLabel(labelPref.label)] = pref;
}
}
return ModerationPrefs(
adultContentEnabled: adultContentEnabled,
labels: {
...kDefaultLabelSettings.map((k, v) => MapEntry(k.value, v)),
...labels,
},
labelers: labelers
.map(
(e) => ModerationPrefsLabeler(did: e['did'], labels: e['labels']),
)
.toList(),
mutedWords: mutedWords,
hiddenPosts: hiddenPosts,
);
}