protected static function can_contact_user(int $recipientid, int $senderid) : bool {
        if (has_capability('moodle/site:messageanyuser', \context_system::instance(), $senderid) ||
            $recipientid == $senderid) {
            // The sender has the ability to contact any user across the entire site or themselves.
            return true;
        }

        // The initial value of $cancontact is null to indicate that a value has not been determined.
        $cancontact = null;

        if (self::is_blocked($recipientid, $senderid)) {
            // The recipient has specifically blocked this sender.
            $cancontact = false;
        }

        $sharedcourses = null;
        if (null === $cancontact) {
            // There are three user preference options:
            // - Site: Allow anyone not explicitly blocked to contact me;
            // - Course members: Allow anyone I am in a course with to contact me; and
            // - Contacts: Only allow my contacts to contact me.
            //
            // The Site option is only possible when the messagingallusers site setting is also enabled.

            $privacypreference = self::get_user_privacy_messaging_preference($recipientid);
            if (self::MESSAGE_PRIVACY_SITE === $privacypreference) {
                // The user preference is to allow any user to contact them.
                // No need to check anything else.
                $cancontact = true;
            } else {
                // This user only allows their own contacts, and possibly course peers, to contact them.
                // If the users are contacts then we can avoid the more expensive shared courses check.
                $cancontact = self::is_contact($senderid, $recipientid);

                if (!$cancontact && self::MESSAGE_PRIVACY_COURSEMEMBER === $privacypreference) {
                    // The users are not contacts and the user allows course member messaging.
                    // Check whether these two users share any course together.
                    $sharedcourses = enrol_get_shared_courses($recipientid, $senderid, true);
                    $cancontact = (!empty($sharedcourses));
                }
            }
        }

        if (false === $cancontact) {
            // At the moment the users cannot contact one another.
            // Check whether the messageanyuser capability applies in any of the shared courses.
            // This is intended to allow teachers to message students regardless of message settings.

            // Note: You cannot use empty($sharedcourses) here because this may be an empty array.
            if (null === $sharedcourses) {
                $sharedcourses = enrol_get_shared_courses($recipientid, $senderid, true);
            }

            foreach ($sharedcourses as $course) {
                // Note: enrol_get_shared_courses will preload any shared context.
                if (has_capability('moodle/site:messageanyuser', \context_course::instance($course->id), $senderid)) {
                    $cancontact = true;
                    break;
                }
            }
        }

        return $cancontact;
    }
protected static function can_contact_user(int $recipientid, int $senderid) : bool {
        if (has_capability('moodle/site:messageanyuser', \context_system::instance(), $senderid) ||
            $recipientid == $senderid) {
            // The sender has the ability to contact any user across the entire site or themselves.
            return true;
        }

        // The initial value of $cancontact is null to indicate that a value has not been determined.
        $cancontact = null;

        if (self::is_blocked($recipientid, $senderid)) {
            // The recipient has specifically blocked this sender.
            $cancontact = false;
        }

        $sharedcourses = null;
        if (null === $cancontact) {
            // There are three user preference options:
            // - Site: Allow anyone not explicitly blocked to contact me;
            // - Course members: Allow anyone I am in a course with to contact me; and
            // - Contacts: Only allow my contacts to contact me.
            //
            // The Site option is only possible when the messagingallusers site setting is also enabled.

            $privacypreference = self::get_user_privacy_messaging_preference($recipientid);
            if (self::MESSAGE_PRIVACY_SITE === $privacypreference) {
                // The user preference is to allow any user to contact them.
                // No need to check anything else.
                $cancontact = true;
            } else {
                // This user only allows their own contacts, and possibly course peers, to contact them.
                // If the users are contacts then we can avoid the more expensive shared courses check.
                $cancontact = self::is_contact($senderid, $recipientid);

                if (!$cancontact && self::MESSAGE_PRIVACY_COURSEMEMBER === $privacypreference) {
                    // The users are not contacts and the user allows course member messaging.
                    // Check whether these two users share any course together.
                    $sharedcourses = enrol_get_shared_courses($recipientid, $senderid, true);
                    $cancontact = (!empty($sharedcourses));
                }
            }
        }

        if (false === $cancontact) {
            // At the moment the users cannot contact one another.
            // Check whether the messageanyuser capability applies in any of the shared courses.
            // This is intended to allow teachers to message students regardless of message settings.

            // Note: You cannot use empty($sharedcourses) here because this may be an empty array.
            if (null === $sharedcourses) {
                $sharedcourses = enrol_get_shared_courses($recipientid, $senderid, true);
            }

            foreach ($sharedcourses as $course) {
                // Note: enrol_get_shared_courses will preload any shared context.
                if (has_capability('moodle/site:messageanyuser', \context_course::instance($course->id), $senderid)) {
                    $cancontact = true;
                    break;
                }
            }
        }

        return $cancontact;
    }
protected static function can_contact_user ( int $ recipientid , int $ senderid ) : bool { if ( has_capability ( 'moodle/site:messageanyuser' , \ context_system :: instance ( ) , $ senderid ) || $ recipientid == $ senderid ) { // The sender has the ability to contact any user across the entire site or themselves. return true ; } // The initial value of $cancontact is null to indicate that a value has not been determined. $ cancontact = null ; if ( self :: is_blocked ( $ recipientid , $ senderid ) ) { // The recipient has specifically blocked this sender. $ cancontact = false ; } $ sharedcourses = null ; if ( null === $ cancontact ) { // There are three user preference options: // - Site: Allow anyone not explicitly blocked to contact me; // - Course members: Allow anyone I am in a course with to contact me; and // - Contacts: Only allow my contacts to contact me. // // The Site option is only possible when the messagingallusers site setting is also enabled. $ privacypreference = self :: get_user_privacy_messaging_preference ( $ recipientid ) ; if ( self :: MESSAGE_PRIVACY_SITE === $ privacypreference ) { // The user preference is to allow any user to contact them. // No need to check anything else. $ cancontact = true ; } else { // This user only allows their own contacts, and possibly course peers, to contact them. // If the users are contacts then we can avoid the more expensive shared courses check. $ cancontact = self :: is_contact ( $ senderid , $ recipientid ) ; if ( ! $ cancontact && self :: MESSAGE_PRIVACY_COURSEMEMBER === $ privacypreference ) { // The users are not contacts and the user allows course member messaging. // Check whether these two users share any course together. $ sharedcourses = enrol_get_shared_courses ( $ recipientid , $ senderid , true ) ; $ cancontact = ( ! empty ( $ sharedcourses ) ) ; } } } if ( false === $ cancontact ) { // At the moment the users cannot contact one another. // Check whether the messageanyuser capability applies in any of the shared courses. // This is intended to allow teachers to message students regardless of message settings. // Note: You cannot use empty($sharedcourses) here because this may be an empty array. if ( null === $ sharedcourses ) { $ sharedcourses = enrol_get_shared_courses ( $ recipientid , $ senderid , true ) ; } foreach ( $ sharedcourses as $ course ) { // Note: enrol_get_shared_courses will preload any shared context. if ( has_capability ( 'moodle/site:messageanyuser' , \ context_course :: instance ( $ course -> id ) , $ senderid ) ) { $ cancontact = true ; break ; } } } return $ cancontact ; }
Checks if the sender can message the recipient.

@param int $recipientid
@param int $senderid
@return bool true if recipient hasn't blocked sender and sender can contact to recipient, false otherwise.
Checks if the sender can message the recipient .