getModerationPrefs method

ModerationPrefs getModerationPrefs({
  1. List<String> appLabelers = const [_kBskyLabelerDid],
})

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,
  );
}