*/ private $checks; /** * Constructor. * * @param array $checks Ordered checks. */ public function __construct( array $checks ) { $this->checks = array_values( $checks ); } /** * Evaluate a submission context. * * @param SubmissionContext $context Normalized submission context. * @param SettingsSnapshot $settings Immutable settings snapshot. */ public function evaluate( SubmissionContext $context, SettingsSnapshot $settings ): SpamDecision { if ( SettingsSnapshot::MODE_DISABLED === $settings->get_protection_mode() ) { return SpamDecision::allow(); } $reason_codes = array(); $has_block = false; $has_suspicious = false; foreach ( $this->checks as $check ) { if ( ! $check->is_enabled( $settings ) ) { continue; } $result = $check->evaluate( $context, $settings ); if ( $result->is_blocking() ) { $has_block = true; } if ( $result->is_suspicious() ) { $has_suspicious = true; } foreach ( $result->get_reason_codes() as $reason_code ) { $reason_codes[] = $reason_code; } } $reason_codes = array_values( array_unique( $reason_codes ) ); if ( SettingsSnapshot::MODE_MONITOR === $settings->get_protection_mode() ) { return array() === $reason_codes ? SpamDecision::allow() : SpamDecision::suspicious( $reason_codes ); } if ( $has_block ) { return SpamDecision::block( $reason_codes ); } if ( $has_suspicious ) { return SpamDecision::suspicious( $reason_codes ); } return SpamDecision::allow(); } }