884 lines
29 KiB
Scala
884 lines
29 KiB
Scala
package com.twitter.visibility.rules
|
|
|
|
import com.twitter.visibility.common.ModelScoreThresholds
|
|
import com.twitter.visibility.common.actions.AvoidReason
|
|
import com.twitter.visibility.common.actions.AvoidReason.MightNotBeSuitableForAds
|
|
import com.twitter.visibility.common.actions.LimitedEngagementReason
|
|
import com.twitter.visibility.common.actions.TweetVisibilityNudgeReason
|
|
import com.twitter.visibility.configapi.configs.DeciderKey
|
|
import com.twitter.visibility.configapi.params.FSRuleParams.HighSpammyTweetContentScoreSearchLatestProdTweetLabelDropRuleThresholdParam
|
|
import com.twitter.visibility.configapi.params.FSRuleParams.HighSpammyTweetContentScoreSearchTopProdTweetLabelDropRuleThresholdParam
|
|
import com.twitter.visibility.configapi.params.FSRuleParams.HighSpammyTweetContentScoreTrendLatestTweetLabelDropRuleThresholdParam
|
|
import com.twitter.visibility.configapi.params.FSRuleParams.HighSpammyTweetContentScoreTrendTopTweetLabelDropRuleThresholdParam
|
|
import com.twitter.visibility.configapi.params.FSRuleParams.SkipTweetDetailLimitedEngagementRuleEnabledParam
|
|
import com.twitter.visibility.configapi.params.RuleParam
|
|
import com.twitter.visibility.configapi.params.RuleParams._
|
|
import com.twitter.visibility.models.TweetSafetyLabelType
|
|
import com.twitter.visibility.rules.Condition._
|
|
import com.twitter.visibility.rules.Condition.{True => TrueCondition}
|
|
import com.twitter.visibility.rules.Reason._
|
|
import com.twitter.visibility.rules.RuleActionSourceBuilder.TweetSafetyLabelSourceBuilder
|
|
|
|
object AbusiveTweetLabelRule
|
|
extends NonAuthorWithTweetLabelRule(
|
|
Drop(Unspecified),
|
|
TweetSafetyLabelType.Abusive
|
|
)
|
|
with DoesLogVerdict
|
|
|
|
object AbusiveNonFollowerTweetLabelRule
|
|
extends NonFollowerWithTweetLabelRule(
|
|
Drop(Toxicity),
|
|
TweetSafetyLabelType.Abusive
|
|
)
|
|
|
|
object AbusiveUqfNonFollowerTweetLabelRule
|
|
extends NonFollowerWithUqfTweetLabelRule(
|
|
Drop(Toxicity),
|
|
TweetSafetyLabelType.Abusive
|
|
)
|
|
|
|
object AbusiveHighRecallTweetLabelRule
|
|
extends NonAuthorWithTweetLabelRule(
|
|
Drop(Unspecified),
|
|
TweetSafetyLabelType.AbusiveHighRecall
|
|
)
|
|
|
|
object AbusiveHighRecallNonFollowerTweetLabelRule
|
|
extends NonFollowerWithTweetLabelRule(
|
|
Interstitial(PossiblyUndesirable),
|
|
TweetSafetyLabelType.AbusiveHighRecall
|
|
)
|
|
|
|
object AutomationTweetLabelRule
|
|
extends NonFollowerWithTweetLabelRule(
|
|
Drop(Unspecified),
|
|
TweetSafetyLabelType.Automation
|
|
)
|
|
|
|
object BystanderAbusiveTweetLabelRule
|
|
extends NonAuthorWithTweetLabelRule(
|
|
Drop(Unspecified),
|
|
TweetSafetyLabelType.BystanderAbusive
|
|
)
|
|
|
|
object BystanderAbusiveNonFollowerTweetLabelRule
|
|
extends NonFollowerWithTweetLabelRule(
|
|
Drop(Unspecified),
|
|
TweetSafetyLabelType.BystanderAbusive
|
|
)
|
|
|
|
abstract class DuplicateContentTweetLabelRule(action: Action)
|
|
extends NonAuthorWithTweetLabelRule(
|
|
action,
|
|
TweetSafetyLabelType.DuplicateContent
|
|
)
|
|
|
|
object DuplicateContentTweetLabelDropRule
|
|
extends DuplicateContentTweetLabelRule(Drop(TweetLabelDuplicateContent))
|
|
|
|
object DuplicateContentTweetLabelTombstoneRule
|
|
extends DuplicateContentTweetLabelRule(Tombstone(Epitaph.Unavailable))
|
|
|
|
object DuplicateMentionTweetLabelRule
|
|
extends NonFollowerWithTweetLabelRule(
|
|
Drop(Unspecified),
|
|
TweetSafetyLabelType.DuplicateMention
|
|
)
|
|
|
|
object DuplicateMentionUqfTweetLabelRule
|
|
extends NonFollowerWithUqfTweetLabelRule(
|
|
Drop(TweetLabelDuplicateMention),
|
|
TweetSafetyLabelType.DuplicateMention
|
|
)
|
|
|
|
object GoreAndViolenceTweetLabelRule
|
|
extends ConditionWithTweetLabelRule(
|
|
Drop(Unspecified),
|
|
And(
|
|
NonAuthorViewer,
|
|
TweetComposedBefore(TweetSafetyLabelType.GoreAndViolence.DeprecatedAt)
|
|
),
|
|
TweetSafetyLabelType.GoreAndViolence
|
|
)
|
|
|
|
object LiveLowQualityTweetLabelRule
|
|
extends NonAuthorWithTweetLabelRule(
|
|
Drop(Unspecified),
|
|
TweetSafetyLabelType.LiveLowQuality
|
|
)
|
|
|
|
object LowQualityMentionTweetLabelRule
|
|
extends RuleWithConstantAction(
|
|
Drop(LowQualityMention),
|
|
And(
|
|
TweetHasLabelForPerspectivalUser(TweetSafetyLabelType.LowQualityMention),
|
|
ViewerHasUqfEnabled
|
|
)
|
|
)
|
|
|
|
abstract class NsfwCardImageTweetLabelBaseRule(
|
|
override val action: Action,
|
|
val additionalCondition: Condition = TrueCondition,
|
|
) extends RuleWithConstantAction(
|
|
action,
|
|
And(
|
|
additionalCondition,
|
|
TweetHasLabel(TweetSafetyLabelType.NsfwCardImage)
|
|
)
|
|
)
|
|
|
|
object NsfwCardImageTweetLabelRule
|
|
extends NsfwCardImageTweetLabelBaseRule(
|
|
action = Drop(Nsfw),
|
|
additionalCondition = NonAuthorViewer,
|
|
)
|
|
|
|
object NsfwCardImageAllUsersTweetLabelRule
|
|
extends NsfwCardImageTweetLabelBaseRule(
|
|
action = Interstitial(Nsfw)
|
|
)
|
|
|
|
object NsfwCardImageAvoidAllUsersTweetLabelRule
|
|
extends NsfwCardImageTweetLabelBaseRule(
|
|
action = Avoid(Some(AvoidReason.ContainsNsfwMedia)),
|
|
) {
|
|
override def enabled: Seq[RuleParam[Boolean]] = Seq(EnableAvoidNsfwRulesParam)
|
|
|
|
override val fallbackActionBuilder: Option[ActionBuilder[_ <: Action]] = Some(
|
|
new ConstantActionBuilder(Avoid(Some(MightNotBeSuitableForAds))))
|
|
}
|
|
|
|
object NsfwCardImageAvoidAdPlacementAllUsersTweetLabelRule
|
|
extends NsfwCardImageTweetLabelBaseRule(
|
|
action = Avoid(Some(AvoidReason.ContainsNsfwMedia)),
|
|
) {
|
|
override def enabled: Seq[RuleParam[Boolean]] = Seq(EnableAvoidNsfwRulesParam)
|
|
}
|
|
|
|
object SearchAvoidTweetNsfwAdminRule
|
|
extends RuleWithConstantAction(
|
|
Avoid(Some(AvoidReason.ContainsNsfwMedia)),
|
|
TweetHasNsfwAdminAuthor
|
|
) {
|
|
override def enabled: Seq[RuleParam[Boolean]] = Seq(EnableAvoidNsfwRulesParam)
|
|
}
|
|
|
|
object SearchAvoidTweetNsfwUserRule
|
|
extends RuleWithConstantAction(
|
|
Avoid(Some(AvoidReason.ContainsNsfwMedia)),
|
|
TweetHasNsfwUserAuthor
|
|
) {
|
|
override def enabled: Seq[RuleParam[Boolean]] = Seq(EnableAvoidNsfwRulesParam)
|
|
}
|
|
|
|
object NsfwCardImageAllUsersTweetLabelDropRule
|
|
extends NsfwCardImageTweetLabelBaseRule(
|
|
action = Drop(Nsfw),
|
|
)
|
|
|
|
object HighProactiveTosScoreTweetLabelDropRule
|
|
extends NonAuthorWithTweetLabelRule(
|
|
Drop(Unspecified),
|
|
TweetSafetyLabelType.HighProactiveTosScore
|
|
)
|
|
|
|
object HighProactiveTosScoreTweetLabelDropSearchRule
|
|
extends NonAuthorAndNonFollowerWithTweetLabelRule(
|
|
Drop(Unspecified),
|
|
TweetSafetyLabelType.HighProactiveTosScore
|
|
)
|
|
|
|
object NsfwHighPrecisionTweetLabelRule
|
|
extends NonAuthorWithTweetLabelRule(
|
|
Drop(Nsfw),
|
|
TweetSafetyLabelType.NsfwHighPrecision
|
|
)
|
|
|
|
object NsfwHighPrecisionAllUsersTweetLabelDropRule
|
|
extends TweetHasLabelRule(
|
|
Drop(Nsfw),
|
|
TweetSafetyLabelType.NsfwHighPrecision
|
|
)
|
|
|
|
object NsfwHighPrecisionInnerQuotedTweetLabelRule
|
|
extends ConditionWithTweetLabelRule(
|
|
Drop(Nsfw),
|
|
And(IsQuotedInnerTweet, NonAuthorViewer),
|
|
TweetSafetyLabelType.NsfwHighPrecision
|
|
) {
|
|
override def enabled: Seq[RuleParam[Boolean]] = Seq(EnableNsfwHpQuotedTweetDropRuleParam)
|
|
}
|
|
|
|
object NsfwHighPrecisionTombstoneInnerQuotedTweetLabelRule
|
|
extends ConditionWithTweetLabelRule(
|
|
Tombstone(Epitaph.Unavailable),
|
|
And(IsQuotedInnerTweet, NonAuthorViewer),
|
|
TweetSafetyLabelType.NsfwHighPrecision
|
|
) {
|
|
override def enabled: Seq[RuleParam[Boolean]] = Seq(EnableNsfwHpQuotedTweetTombstoneRuleParam)
|
|
}
|
|
|
|
object GoreAndViolenceHighPrecisionTweetLabelRule
|
|
extends NonAuthorWithTweetLabelRule(
|
|
Drop(Nsfw),
|
|
TweetSafetyLabelType.GoreAndViolenceHighPrecision
|
|
)
|
|
|
|
object NsfwReportedHeuristicsTweetLabelRule
|
|
extends NonAuthorWithTweetLabelRule(
|
|
Drop(Nsfw),
|
|
TweetSafetyLabelType.NsfwReportedHeuristics
|
|
)
|
|
|
|
object GoreAndViolenceReportedHeuristicsTweetLabelRule
|
|
extends NonAuthorWithTweetLabelRule(
|
|
Drop(Nsfw),
|
|
TweetSafetyLabelType.GoreAndViolenceReportedHeuristics
|
|
)
|
|
|
|
object NsfwHighPrecisionInterstitialAllUsersTweetLabelRule
|
|
extends TweetHasLabelRule(
|
|
Interstitial(Nsfw),
|
|
TweetSafetyLabelType.NsfwHighPrecision
|
|
)
|
|
with DoesLogVerdict
|
|
|
|
object GoreAndViolenceHighPrecisionAvoidAllUsersTweetLabelRule
|
|
extends TweetHasLabelRule(
|
|
Avoid(Some(AvoidReason.ContainsNsfwMedia)),
|
|
TweetSafetyLabelType.GoreAndViolenceHighPrecision
|
|
) {
|
|
override def enabled: Seq[RuleParam[Boolean]] = Seq(EnableAvoidNsfwRulesParam)
|
|
|
|
override val fallbackActionBuilder: Option[ActionBuilder[_ <: Action]] = Some(
|
|
new ConstantActionBuilder(Avoid(Some(MightNotBeSuitableForAds))))
|
|
}
|
|
|
|
object GoreAndViolenceHighPrecisionAllUsersTweetLabelRule
|
|
extends TweetHasLabelRule(
|
|
Interstitial(Nsfw),
|
|
TweetSafetyLabelType.GoreAndViolenceHighPrecision
|
|
)
|
|
with DoesLogVerdict {
|
|
override def actionSourceBuilder: Option[RuleActionSourceBuilder] = Some(
|
|
TweetSafetyLabelSourceBuilder(TweetSafetyLabelType.GoreAndViolenceHighPrecision)
|
|
)
|
|
}
|
|
|
|
object NsfwReportedHeuristicsAvoidAllUsersTweetLabelRule
|
|
extends TweetHasLabelRule(
|
|
Avoid(Some(AvoidReason.ContainsNsfwMedia)),
|
|
TweetSafetyLabelType.NsfwReportedHeuristics
|
|
) {
|
|
override def enabled: Seq[RuleParam[Boolean]] = Seq(EnableAvoidNsfwRulesParam)
|
|
|
|
override val fallbackActionBuilder: Option[ActionBuilder[_ <: Action]] = Some(
|
|
new ConstantActionBuilder(Avoid(Some(MightNotBeSuitableForAds))))
|
|
}
|
|
|
|
object NsfwReportedHeuristicsAvoidAdPlacementAllUsersTweetLabelRule
|
|
extends TweetHasLabelRule(
|
|
Avoid(Some(AvoidReason.ContainsNsfwMedia)),
|
|
TweetSafetyLabelType.NsfwReportedHeuristics
|
|
) {
|
|
override def enabled: Seq[RuleParam[Boolean]] = Seq(EnableAvoidNsfwRulesParam)
|
|
|
|
override val fallbackActionBuilder: Option[ActionBuilder[_ <: Action]] = Some(
|
|
new ConstantActionBuilder(Avoid(Some(MightNotBeSuitableForAds))))
|
|
}
|
|
|
|
object NsfwReportedHeuristicsAllUsersTweetLabelRule
|
|
extends TweetHasLabelRule(
|
|
Interstitial(Nsfw),
|
|
TweetSafetyLabelType.NsfwReportedHeuristics
|
|
)
|
|
|
|
object GoreAndViolenceReportedHeuristicsAllUsersTweetLabelRule
|
|
extends TweetHasLabelRule(
|
|
Interstitial(Nsfw),
|
|
TweetSafetyLabelType.GoreAndViolenceReportedHeuristics
|
|
)
|
|
|
|
object GoreAndViolenceReportedHeuristicsAvoidAllUsersTweetLabelRule
|
|
extends TweetHasLabelRule(
|
|
Avoid(Some(AvoidReason.ContainsNsfwMedia)),
|
|
TweetSafetyLabelType.GoreAndViolenceReportedHeuristics
|
|
) {
|
|
override def enabled: Seq[RuleParam[Boolean]] = Seq(EnableAvoidNsfwRulesParam)
|
|
|
|
override val fallbackActionBuilder: Option[ActionBuilder[_ <: Action]] = Some(
|
|
new ConstantActionBuilder(Avoid(Some(MightNotBeSuitableForAds))))
|
|
}
|
|
|
|
object GoreAndViolenceReportedHeuristicsAvoidAdPlacementAllUsersTweetLabelRule
|
|
extends TweetHasLabelRule(
|
|
Avoid(Some(AvoidReason.ContainsNsfwMedia)),
|
|
TweetSafetyLabelType.GoreAndViolenceReportedHeuristics
|
|
) {
|
|
override def enabled: Seq[RuleParam[Boolean]] = Seq(EnableAvoidNsfwRulesParam)
|
|
|
|
override val fallbackActionBuilder: Option[ActionBuilder[_ <: Action]] = Some(
|
|
new ConstantActionBuilder(Avoid(Some(MightNotBeSuitableForAds))))
|
|
}
|
|
|
|
object GoreAndViolenceHighPrecisionAllUsersTweetLabelDropRule
|
|
extends TweetHasLabelRule(
|
|
Drop(Nsfw),
|
|
TweetSafetyLabelType.GoreAndViolenceHighPrecision
|
|
)
|
|
|
|
object NsfwReportedHeuristicsAllUsersTweetLabelDropRule
|
|
extends TweetHasLabelRule(
|
|
Drop(Nsfw),
|
|
TweetSafetyLabelType.NsfwReportedHeuristics
|
|
)
|
|
|
|
object GoreAndViolenceReportedHeuristicsAllUsersTweetLabelDropRule
|
|
extends TweetHasLabelRule(
|
|
Drop(Nsfw),
|
|
TweetSafetyLabelType.GoreAndViolenceReportedHeuristics
|
|
)
|
|
|
|
object NsfwHighRecallTweetLabelRule
|
|
extends NonAuthorWithTweetLabelRule(
|
|
Drop(Nsfw),
|
|
TweetSafetyLabelType.NsfwHighRecall
|
|
)
|
|
|
|
object NsfwHighRecallAllUsersTweetLabelDropRule
|
|
extends TweetHasLabelRule(
|
|
Drop(Nsfw),
|
|
TweetSafetyLabelType.NsfwHighRecall
|
|
)
|
|
|
|
abstract class PdnaTweetLabelRule(
|
|
override val action: Action,
|
|
val additionalCondition: Condition)
|
|
extends ConditionWithTweetLabelRule(
|
|
action,
|
|
And(NonAuthorViewer, additionalCondition),
|
|
TweetSafetyLabelType.Pdna
|
|
)
|
|
|
|
object PdnaTweetLabelRule extends PdnaTweetLabelRule(Drop(PdnaTweet), Condition.True)
|
|
|
|
object PdnaTweetLabelTombstoneRule
|
|
extends PdnaTweetLabelRule(Tombstone(Epitaph.Unavailable), Condition.True)
|
|
|
|
object PdnaQuotedTweetLabelTombstoneRule
|
|
extends PdnaTweetLabelRule(Tombstone(Epitaph.Unavailable), Condition.IsQuotedInnerTweet) {
|
|
override def enabled: Seq[RuleParam[Boolean]] = Seq(EnablePdnaQuotedTweetTombstoneRuleParam)
|
|
}
|
|
|
|
object PdnaAllUsersTweetLabelRule
|
|
extends TweetHasLabelRule(
|
|
Drop(Unspecified),
|
|
TweetSafetyLabelType.Pdna
|
|
)
|
|
|
|
object SearchBlacklistTweetLabelRule
|
|
extends NonAuthorWithTweetLabelRule(
|
|
Drop(Unspecified),
|
|
TweetSafetyLabelType.SearchBlacklist
|
|
)
|
|
|
|
object SearchBlacklistHighRecallTweetLabelDropRule
|
|
extends NonAuthorAndNonFollowerWithTweetLabelRule(
|
|
Drop(Unspecified),
|
|
TweetSafetyLabelType.SearchBlacklistHighRecall
|
|
)
|
|
|
|
abstract class SpamTweetLabelRule(
|
|
override val action: Action,
|
|
val additionalCondition: Condition)
|
|
extends ConditionWithTweetLabelRule(
|
|
action,
|
|
And(NonAuthorViewer, additionalCondition),
|
|
TweetSafetyLabelType.Spam
|
|
)
|
|
with DoesLogVerdict
|
|
|
|
object SpamTweetLabelRule extends SpamTweetLabelRule(Drop(TweetLabeledSpam), Condition.True)
|
|
|
|
object SpamTweetLabelTombstoneRule
|
|
extends SpamTweetLabelRule(Tombstone(Epitaph.Unavailable), Condition.True)
|
|
|
|
object SpamQuotedTweetLabelTombstoneRule
|
|
extends SpamTweetLabelRule(Tombstone(Epitaph.Unavailable), Condition.IsQuotedInnerTweet) {
|
|
override def enabled: Seq[RuleParam[Boolean]] = Seq(EnableSpamQuotedTweetTombstoneRuleParam)
|
|
}
|
|
|
|
object SpamAllUsersTweetLabelRule
|
|
extends TweetHasLabelRule(
|
|
Drop(Unspecified),
|
|
TweetSafetyLabelType.Spam
|
|
)
|
|
|
|
abstract class BounceTweetLabelRule(override val action: Action)
|
|
extends NonAuthorWithTweetLabelRule(
|
|
action,
|
|
TweetSafetyLabelType.Bounce
|
|
)
|
|
|
|
object BounceTweetLabelRule extends BounceTweetLabelRule(Drop(Bounce))
|
|
|
|
object BounceTweetLabelTombstoneRule extends BounceTweetLabelRule(Tombstone(Epitaph.Bounced))
|
|
|
|
abstract class BounceOuterTweetLabelRule(override val action: Action)
|
|
extends ConditionWithTweetLabelRule(
|
|
action,
|
|
And(Not(Condition.IsQuotedInnerTweet), NonAuthorViewer),
|
|
TweetSafetyLabelType.Bounce
|
|
)
|
|
|
|
object BounceOuterTweetTombstoneRule extends BounceOuterTweetLabelRule(Tombstone(Epitaph.Bounced))
|
|
|
|
object BounceQuotedTweetTombstoneRule
|
|
extends ConditionWithTweetLabelRule(
|
|
Tombstone(Epitaph.Bounced),
|
|
Condition.IsQuotedInnerTweet,
|
|
TweetSafetyLabelType.Bounce
|
|
)
|
|
|
|
object BounceAllUsersTweetLabelRule
|
|
extends TweetHasLabelRule(
|
|
Drop(Bounce),
|
|
TweetSafetyLabelType.Bounce
|
|
)
|
|
|
|
|
|
abstract class SpamHighRecallTweetLabelRule(action: Action)
|
|
extends NonAuthorWithTweetLabelRule(
|
|
action,
|
|
TweetSafetyLabelType.SpamHighRecall
|
|
)
|
|
|
|
object SpamHighRecallTweetLabelDropRule
|
|
extends SpamHighRecallTweetLabelRule(Drop(SpamHighRecallTweet))
|
|
|
|
object SpamHighRecallTweetLabelTombstoneRule
|
|
extends SpamHighRecallTweetLabelRule(Tombstone(Epitaph.Unavailable))
|
|
|
|
object UntrustedUrlAllViewersTweetLabelRule
|
|
extends TweetHasLabelRule(
|
|
Drop(Unspecified),
|
|
TweetSafetyLabelType.UntrustedUrl
|
|
)
|
|
|
|
object DownrankSpamReplyAllViewersTweetLabelRule
|
|
extends TweetHasLabelRule(
|
|
Drop(Unspecified),
|
|
TweetSafetyLabelType.DownrankSpamReply
|
|
) {
|
|
override def enabled: Seq[RuleParam[Boolean]] =
|
|
Seq(EnableDownrankSpamReplySectioningRuleParam)
|
|
}
|
|
|
|
object UntrustedUrlTweetLabelRule
|
|
extends NonAuthorWithTweetLabelRule(
|
|
Drop(Unspecified),
|
|
TweetSafetyLabelType.UntrustedUrl
|
|
)
|
|
|
|
object DownrankSpamReplyTweetLabelRule
|
|
extends NonAuthorWithTweetLabelRule(
|
|
Drop(Unspecified),
|
|
TweetSafetyLabelType.DownrankSpamReply
|
|
) {
|
|
override def enabled: Seq[RuleParam[Boolean]] =
|
|
Seq(EnableDownrankSpamReplySectioningRuleParam)
|
|
}
|
|
|
|
object UntrustedUrlUqfNonFollowerTweetLabelRule
|
|
extends NonFollowerWithUqfTweetLabelRule(
|
|
Drop(UntrustedUrl),
|
|
TweetSafetyLabelType.UntrustedUrl
|
|
)
|
|
|
|
object DownrankSpamReplyUqfNonFollowerTweetLabelRule
|
|
extends NonFollowerWithUqfTweetLabelRule(
|
|
Drop(SpamReplyDownRank),
|
|
TweetSafetyLabelType.DownrankSpamReply
|
|
) {
|
|
override def enabled: Seq[RuleParam[Boolean]] =
|
|
Seq(EnableDownrankSpamReplySectioningRuleParam)
|
|
}
|
|
|
|
object NsfaHighRecallTweetLabelRule
|
|
extends RuleWithConstantAction(
|
|
Drop(Unspecified),
|
|
And(
|
|
NonAuthorViewer,
|
|
TweetHasLabel(TweetSafetyLabelType.NsfaHighRecall)
|
|
)
|
|
)
|
|
|
|
object NsfaHighRecallTweetLabelInterstitialRule
|
|
extends RuleWithConstantAction(
|
|
Interstitial(Unspecified),
|
|
And(
|
|
NonAuthorViewer,
|
|
TweetHasLabel(TweetSafetyLabelType.NsfaHighRecall)
|
|
)
|
|
)
|
|
|
|
object NsfwVideoTweetLabelDropRule
|
|
extends NonAuthorWithTweetLabelRule(
|
|
Drop(Nsfw),
|
|
TweetSafetyLabelType.NsfwVideo
|
|
) {
|
|
override def enabled: Seq[RuleParam[Boolean]] = Seq(EnableNsfwTextSectioningRuleParam)
|
|
}
|
|
|
|
object NsfwTextTweetLabelDropRule
|
|
extends NonAuthorWithTweetLabelRule(
|
|
Drop(Nsfw),
|
|
TweetSafetyLabelType.NsfwText
|
|
)
|
|
|
|
object NsfwVideoAllUsersTweetLabelDropRule
|
|
extends TweetHasLabelRule(
|
|
Drop(Nsfw),
|
|
TweetSafetyLabelType.NsfwVideo
|
|
)
|
|
|
|
object NsfwTextAllUsersTweetLabelDropRule
|
|
extends TweetHasLabelRule(
|
|
Drop(Nsfw),
|
|
TweetSafetyLabelType.NsfwText
|
|
) {
|
|
override def enabled: Seq[RuleParam[Boolean]] = Seq(EnableNsfwTextSectioningRuleParam)
|
|
}
|
|
|
|
abstract class BaseLowQualityTweetLabelRule(action: Action)
|
|
extends RuleWithConstantAction(
|
|
action,
|
|
And(
|
|
TweetHasLabel(TweetSafetyLabelType.LowQuality),
|
|
TweetComposedBefore(PublicInterest.PolicyConfig.LowQualityProxyLabelStart),
|
|
NonAuthorViewer
|
|
)
|
|
)
|
|
with DoesLogVerdict {
|
|
override def actionSourceBuilder: Option[RuleActionSourceBuilder] = Some(
|
|
TweetSafetyLabelSourceBuilder(TweetSafetyLabelType.LowQuality))
|
|
}
|
|
|
|
object LowQualityTweetLabelDropRule extends BaseLowQualityTweetLabelRule(Drop(LowQualityTweet))
|
|
|
|
object LowQualityTweetLabelTombstoneRule
|
|
extends BaseLowQualityTweetLabelRule(Tombstone(Epitaph.Unavailable))
|
|
|
|
abstract class SafetyCrisisLevelDropRule(level: Int, condition: Condition = TrueCondition)
|
|
extends ConditionWithTweetLabelRule(
|
|
Drop(Unspecified),
|
|
And(
|
|
NonAuthorViewer,
|
|
condition,
|
|
TweetHasSafetyLabelWithScoreEqInt(TweetSafetyLabelType.SafetyCrisis, level)
|
|
),
|
|
TweetSafetyLabelType.SafetyCrisis
|
|
)
|
|
|
|
object SafetyCrisisAnyLevelDropRule
|
|
extends NonAuthorWithTweetLabelRule(
|
|
Drop(Unspecified),
|
|
TweetSafetyLabelType.SafetyCrisis
|
|
)
|
|
|
|
object SafetyCrisisLevel2DropRule extends SafetyCrisisLevelDropRule(2, Not(ViewerDoesFollowAuthor))
|
|
|
|
object SafetyCrisisLevel3DropRule extends SafetyCrisisLevelDropRule(3, Not(ViewerDoesFollowAuthor))
|
|
|
|
object SafetyCrisisLevel4DropRule extends SafetyCrisisLevelDropRule(4)
|
|
|
|
abstract class SafetyCrisisLevelSectionRule(level: Int)
|
|
extends ConditionWithNotInnerCircleOfFriendsRule(
|
|
ConversationSectionAbusiveQuality,
|
|
And(
|
|
TweetHasLabel(TweetSafetyLabelType.SafetyCrisis),
|
|
TweetHasSafetyLabelWithScoreEqInt(TweetSafetyLabelType.SafetyCrisis, level))
|
|
) {
|
|
override def actionSourceBuilder: Option[RuleActionSourceBuilder] = Some(
|
|
TweetSafetyLabelSourceBuilder(TweetSafetyLabelType.SafetyCrisis))
|
|
}
|
|
|
|
object SafetyCrisisLevel3SectionRule
|
|
extends SafetyCrisisLevelSectionRule(3)
|
|
with DoesLogVerdictDecidered {
|
|
override def verdictLogDeciderKey = DeciderKey.EnableDownlevelRuleVerdictLogging
|
|
}
|
|
|
|
object SafetyCrisisLevel4SectionRule
|
|
extends SafetyCrisisLevelSectionRule(4)
|
|
with DoesLogVerdictDecidered {
|
|
override def verdictLogDeciderKey = DeciderKey.EnableDownlevelRuleVerdictLogging
|
|
}
|
|
|
|
object DoNotAmplifyDropRule
|
|
extends NonFollowerWithTweetLabelRule(Drop(Unspecified), TweetSafetyLabelType.DoNotAmplify)
|
|
|
|
object DoNotAmplifyAllViewersDropRule
|
|
extends TweetHasLabelRule(Drop(Unspecified), TweetSafetyLabelType.DoNotAmplify)
|
|
|
|
object DoNotAmplifySectionRule
|
|
extends ConditionWithNotInnerCircleOfFriendsRule(
|
|
ConversationSectionAbusiveQuality,
|
|
TweetHasLabel(TweetSafetyLabelType.DoNotAmplify))
|
|
|
|
object HighPSpammyScoreAllViewerDropRule
|
|
extends TweetHasLabelRule(Drop(Unspecified), TweetSafetyLabelType.HighPSpammyTweetScore)
|
|
|
|
object HighPSpammyTweetScoreSearchTweetLabelDropRule
|
|
extends RuleWithConstantAction(
|
|
action = Drop(Unspecified),
|
|
condition = And(
|
|
LoggedOutOrViewerNotFollowingAuthor,
|
|
TweetHasLabelWithScoreAboveThreshold(
|
|
TweetSafetyLabelType.HighPSpammyTweetScore,
|
|
ModelScoreThresholds.HighPSpammyTweetScoreThreshold)
|
|
)
|
|
)
|
|
with DoesLogVerdictDecidered {
|
|
override def enabled: Seq[RuleParam[Boolean]] = Seq(
|
|
EnableHighPSpammyTweetScoreSearchTweetLabelDropRuleParam)
|
|
override def actionSourceBuilder: Option[RuleActionSourceBuilder] = Some(
|
|
TweetSafetyLabelSourceBuilder(TweetSafetyLabelType.HighPSpammyTweetScore))
|
|
override def verdictLogDeciderKey: DeciderKey.Value =
|
|
DeciderKey.EnableSpammyTweetRuleVerdictLogging
|
|
}
|
|
|
|
object AdsManagerDenyListAllUsersTweetLabelRule
|
|
extends TweetHasLabelRule(
|
|
Drop(Unspecified),
|
|
TweetSafetyLabelType.AdsManagerDenyList
|
|
)
|
|
|
|
abstract class SmyteSpamTweetLabelRule(action: Action)
|
|
extends NonAuthorWithTweetLabelRule(
|
|
action,
|
|
TweetSafetyLabelType.SmyteSpamTweet
|
|
) {
|
|
override def enabled: Seq[RuleParam[Boolean]] = Seq(EnableSmyteSpamTweetRuleParam)
|
|
}
|
|
|
|
object SmyteSpamTweetLabelDropRule extends SmyteSpamTweetLabelRule(Drop(TweetLabeledSpam))
|
|
|
|
object SmyteSpamTweetLabelTombstoneRule
|
|
extends SmyteSpamTweetLabelRule(Tombstone(Epitaph.Unavailable))
|
|
|
|
object SmyteSpamTweetLabelDropSearchRule extends SmyteSpamTweetLabelRule(Drop(Unspecified))
|
|
|
|
object HighSpammyTweetContentScoreSearchLatestTweetLabelDropRule
|
|
extends RuleWithConstantAction(
|
|
action = Drop(Unspecified),
|
|
condition = And(
|
|
Not(IsTweetInTweetLevelStcmHoldback),
|
|
LoggedOutOrViewerNotFollowingAuthor,
|
|
TweetHasLabelWithScoreAboveThresholdWithParam(
|
|
TweetSafetyLabelType.HighSpammyTweetContentScore,
|
|
HighSpammyTweetContentScoreSearchLatestProdTweetLabelDropRuleThresholdParam)
|
|
)
|
|
)
|
|
with DoesLogVerdictDecidered {
|
|
override def actionSourceBuilder: Option[RuleActionSourceBuilder] = Some(
|
|
TweetSafetyLabelSourceBuilder(TweetSafetyLabelType.HighSpammyTweetContentScore))
|
|
override def verdictLogDeciderKey: DeciderKey.Value =
|
|
DeciderKey.EnableSpammyTweetRuleVerdictLogging
|
|
}
|
|
|
|
object HighSpammyTweetContentScoreSearchTopTweetLabelDropRule
|
|
extends RuleWithConstantAction(
|
|
action = Drop(Unspecified),
|
|
condition = And(
|
|
Not(IsTweetInTweetLevelStcmHoldback),
|
|
LoggedOutOrViewerNotFollowingAuthor,
|
|
TweetHasLabelWithScoreAboveThresholdWithParam(
|
|
TweetSafetyLabelType.HighSpammyTweetContentScore,
|
|
HighSpammyTweetContentScoreSearchTopProdTweetLabelDropRuleThresholdParam)
|
|
)
|
|
)
|
|
with DoesLogVerdictDecidered {
|
|
override def actionSourceBuilder: Option[RuleActionSourceBuilder] = Some(
|
|
TweetSafetyLabelSourceBuilder(TweetSafetyLabelType.HighSpammyTweetContentScore))
|
|
override def verdictLogDeciderKey: DeciderKey.Value =
|
|
DeciderKey.EnableSpammyTweetRuleVerdictLogging
|
|
|
|
}
|
|
|
|
object HighSpammyTweetContentScoreTrendsTopTweetLabelDropRule
|
|
extends RuleWithConstantAction(
|
|
action = Drop(Unspecified),
|
|
condition = And(
|
|
Not(IsTweetInTweetLevelStcmHoldback),
|
|
LoggedOutOrViewerNotFollowingAuthor,
|
|
IsTrendClickSourceSearchResult,
|
|
TweetHasLabelWithScoreAboveThresholdWithParam(
|
|
TweetSafetyLabelType.HighSpammyTweetContentScore,
|
|
HighSpammyTweetContentScoreTrendTopTweetLabelDropRuleThresholdParam)
|
|
)
|
|
)
|
|
with DoesLogVerdictDecidered {
|
|
override def actionSourceBuilder: Option[RuleActionSourceBuilder] = Some(
|
|
TweetSafetyLabelSourceBuilder(TweetSafetyLabelType.HighSpammyTweetContentScore))
|
|
override def verdictLogDeciderKey: DeciderKey.Value =
|
|
DeciderKey.EnableSpammyTweetRuleVerdictLogging
|
|
|
|
}
|
|
|
|
object HighSpammyTweetContentScoreTrendsLatestTweetLabelDropRule
|
|
extends RuleWithConstantAction(
|
|
action = Drop(Unspecified),
|
|
condition = And(
|
|
Not(IsTweetInTweetLevelStcmHoldback),
|
|
LoggedOutOrViewerNotFollowingAuthor,
|
|
IsTrendClickSourceSearchResult,
|
|
TweetHasLabelWithScoreAboveThresholdWithParam(
|
|
TweetSafetyLabelType.HighSpammyTweetContentScore,
|
|
HighSpammyTweetContentScoreTrendLatestTweetLabelDropRuleThresholdParam)
|
|
)
|
|
)
|
|
with DoesLogVerdictDecidered {
|
|
override def actionSourceBuilder: Option[RuleActionSourceBuilder] = Some(
|
|
TweetSafetyLabelSourceBuilder(TweetSafetyLabelType.HighSpammyTweetContentScore))
|
|
override def verdictLogDeciderKey: DeciderKey.Value =
|
|
DeciderKey.EnableSpammyTweetRuleVerdictLogging
|
|
}
|
|
|
|
object GoreAndViolenceTopicHighRecallTweetLabelRule
|
|
extends NonAuthorWithTweetLabelRule(
|
|
Drop(Unspecified),
|
|
TweetSafetyLabelType.GoreAndViolenceTopicHighRecall
|
|
) {
|
|
override def enabled: Seq[RuleParam[Boolean]] = Seq(
|
|
EnableGoreAndViolenceTopicHighRecallTweetLabelRule)
|
|
}
|
|
|
|
object CopypastaSpamAllViewersTweetLabelRule
|
|
extends TweetHasLabelRule(
|
|
Drop(Unspecified),
|
|
TweetSafetyLabelType.CopypastaSpam
|
|
) {
|
|
override def enabled: Seq[RuleParam[Boolean]] =
|
|
Seq(EnableCopypastaSpamSearchDropRule)
|
|
}
|
|
|
|
object CopypastaSpamAllViewersSearchTweetLabelRule
|
|
extends TweetHasLabelRule(
|
|
Drop(Unspecified),
|
|
TweetSafetyLabelType.CopypastaSpam
|
|
) {
|
|
override def enabled: Seq[RuleParam[Boolean]] =
|
|
Seq(EnableCopypastaSpamSearchDropRule)
|
|
}
|
|
|
|
object CopypastaSpamNonFollowerSearchTweetLabelRule
|
|
extends NonFollowerWithTweetLabelRule(
|
|
Drop(Unspecified),
|
|
TweetSafetyLabelType.CopypastaSpam
|
|
) {
|
|
override def enabled: Seq[RuleParam[Boolean]] =
|
|
Seq(EnableCopypastaSpamSearchDropRule)
|
|
}
|
|
|
|
object CopypastaSpamAbusiveQualityTweetLabelRule
|
|
extends ConditionWithNotInnerCircleOfFriendsRule(
|
|
ConversationSectionAbusiveQuality,
|
|
TweetHasLabel(TweetSafetyLabelType.CopypastaSpam)
|
|
)
|
|
with DoesLogVerdictDecidered {
|
|
override def enabled: Seq[RuleParam[Boolean]] = Seq(
|
|
EnableCopypastaSpamDownrankConvosAbusiveQualityRule)
|
|
override def actionSourceBuilder: Option[RuleActionSourceBuilder] = Some(
|
|
TweetSafetyLabelSourceBuilder(TweetSafetyLabelType.CopypastaSpam))
|
|
override def verdictLogDeciderKey = DeciderKey.EnableDownlevelRuleVerdictLogging
|
|
}
|
|
|
|
object DynamicProductAdLimitedEngagementTweetLabelRule
|
|
extends TweetHasLabelRule(
|
|
LimitedEngagements(LimitedEngagementReason.DynamicProductAd),
|
|
TweetSafetyLabelType.DynamicProductAd)
|
|
|
|
object SkipTweetDetailLimitedEngagementTweetLabelRule
|
|
extends AlwaysActRule(LimitedEngagements(LimitedEngagementReason.SkipTweetDetail)) {
|
|
override def enabled: Seq[RuleParam[Boolean]] = Seq(
|
|
SkipTweetDetailLimitedEngagementRuleEnabledParam)
|
|
}
|
|
|
|
object DynamicProductAdDropTweetLabelRule
|
|
extends TweetHasLabelRule(Drop(Unspecified), TweetSafetyLabelType.DynamicProductAd)
|
|
|
|
object NsfwTextHighPrecisionTweetLabelDropRule
|
|
extends RuleWithConstantAction(
|
|
Drop(Reason.Nsfw),
|
|
And(
|
|
NonAuthorViewer,
|
|
Or(
|
|
TweetHasLabel(TweetSafetyLabelType.ExperimentalSensitiveIllegal2),
|
|
TweetHasLabel(TweetSafetyLabelType.NsfwTextHighPrecision)
|
|
)
|
|
)
|
|
)
|
|
with DoesLogVerdict {
|
|
override def enabled: Seq[RuleParam[Boolean]] = Seq(EnableNsfwTextHighPrecisionDropRuleParam)
|
|
override def actionSourceBuilder: Option[RuleActionSourceBuilder] = Some(
|
|
TweetSafetyLabelSourceBuilder(TweetSafetyLabelType.NsfwTextHighPrecision))
|
|
}
|
|
|
|
|
|
object ExperimentalNudgeLabelRule
|
|
extends TweetHasLabelRule(
|
|
TweetVisibilityNudge(TweetVisibilityNudgeReason.ExperimentalNudgeSafetyLabelReason),
|
|
TweetSafetyLabelType.ExperimentalNudge) {
|
|
override def enabled: Seq[RuleParam[Boolean]] = Seq(EnableExperimentalNudgeEnabledParam)
|
|
}
|
|
|
|
object NsfwTextTweetLabelAvoidRule
|
|
extends RuleWithConstantAction(
|
|
Avoid(),
|
|
Or(
|
|
TweetHasLabel(TweetSafetyLabelType.ExperimentalSensitiveIllegal2),
|
|
TweetHasLabel(TweetSafetyLabelType.NsfwTextHighPrecision)
|
|
)
|
|
) {
|
|
override def actionSourceBuilder: Option[RuleActionSourceBuilder] = Some(
|
|
TweetSafetyLabelSourceBuilder(TweetSafetyLabelType.NsfwTextHighPrecision))
|
|
}
|
|
|
|
object DoNotAmplifyTweetLabelAvoidRule
|
|
extends TweetHasLabelRule(
|
|
Avoid(),
|
|
TweetSafetyLabelType.DoNotAmplify
|
|
) {
|
|
override val fallbackActionBuilder: Option[ActionBuilder[_ <: Action]] = Some(
|
|
new ConstantActionBuilder(Avoid(Some(MightNotBeSuitableForAds))))
|
|
}
|
|
|
|
object NsfaHighPrecisionTweetLabelAvoidRule
|
|
extends TweetHasLabelRule(
|
|
Avoid(),
|
|
TweetSafetyLabelType.NsfaHighPrecision
|
|
) {
|
|
override val fallbackActionBuilder: Option[ActionBuilder[_ <: Action]] = Some(
|
|
new ConstantActionBuilder(Avoid(Some(MightNotBeSuitableForAds))))
|
|
}
|
|
|
|
object NsfwHighPrecisionTweetLabelAvoidRule
|
|
extends TweetHasLabelRule(
|
|
Avoid(Some(AvoidReason.ContainsNsfwMedia)),
|
|
TweetSafetyLabelType.NsfwHighPrecision
|
|
) {
|
|
override val fallbackActionBuilder: Option[ActionBuilder[_ <: Action]] = Some(
|
|
new ConstantActionBuilder(Avoid(Some(MightNotBeSuitableForAds))))
|
|
}
|
|
|
|
object NsfwHighRecallTweetLabelAvoidRule
|
|
extends TweetHasLabelRule(
|
|
Avoid(Some(AvoidReason.ContainsNsfwMedia)),
|
|
TweetSafetyLabelType.NsfwHighRecall
|
|
) {
|
|
override val fallbackActionBuilder: Option[ActionBuilder[_ <: Action]] = Some(
|
|
new ConstantActionBuilder(Avoid(Some(MightNotBeSuitableForAds))))
|
|
}
|