is_passing()` and `get( 'grade' )`. * * Memberships join the membership family's types; courses the LMS family's. */ final class LifterLms implements Integration { public const PLUGIN = 'lifterlms'; public static function is_active(): bool { return Integrations::enabled( self::PLUGIN, defined( 'LLMS_PLUGIN_FILE' ) ); } public static function event_types(): array { $lms = Lms::event_types(); unset( $lms[ Lms::GROUP_JOINED ], $lms[ Lms::GROUP_LEFT ] ); $memberships = Memberships::event_types(); return $lms + array( Memberships::STARTED => $memberships[ Memberships::STARTED ], Memberships::CANCELLED => $memberships[ Memberships::CANCELLED ], ); } public static function register( ?bool $active = null ): void { if ( ! ( $active ?? self::is_active() ) ) { return; } add_action( 'llms_user_enrolled_in_course', array( __CLASS__, 'log_enrolled' ), 10, 2 ); add_action( 'llms_user_removed_from_course', array( __CLASS__, 'log_unenrolled' ), 10, 4 ); add_action( 'llms_user_added_to_membership_level', array( __CLASS__, 'log_membership_added' ), 10, 2 ); add_action( 'llms_user_removed_from_membership', array( __CLASS__, 'log_membership_removed' ), 10, 4 ); add_action( 'lifterlms_course_completed', array( __CLASS__, 'log_course_completed' ), 10, 2 ); add_action( 'lifterlms_quiz_completed', array( __CLASS__, 'log_quiz_completed' ), 10, 3 ); } public static function post_types(): array { return array(); } public static function internal_post_types(): array { return array(); } /** * @param mixed $student_id The student. * @param mixed $course_id The course. */ public static function log_enrolled( $student_id, $course_id ): void { self::row( Lms::ENROLLED, 'User %1$s enrolled in course "%2$s"', $student_id, $course_id, 'course_id' ); } /** * @param mixed $student_id The student. * @param mixed $course_id The course. * @param mixed $trigger What removed them. * @param mixed $new_status Their enrolment status now. */ public static function log_unenrolled( $student_id, $course_id, $trigger = '', $new_status = '' ): void { self::row( Lms::UNENROLLED, 'User %1$s removed from course "%2$s"', $student_id, $course_id, 'course_id', self::why( $trigger, $new_status ) ); } /** * @param mixed $student_id The student. * @param mixed $membership_id The membership. */ public static function log_membership_added( $student_id, $membership_id ): void { self::row( Memberships::STARTED, 'User %1$s joined membership "%2$s"', $student_id, $membership_id, 'membership_id' ); } /** * @param mixed $student_id The student. * @param mixed $membership_id The membership. * @param mixed $trigger What removed them. * @param mixed $new_status Their status now. */ public static function log_membership_removed( $student_id, $membership_id, $trigger = '', $new_status = '' ): void { self::row( Memberships::CANCELLED, 'User %1$s removed from membership "%2$s"', $student_id, $membership_id, 'membership_id', self::why( $trigger, $new_status ) ); } /** * @param mixed $student_id The student. * @param mixed $course_id The course. */ public static function log_course_completed( $student_id, $course_id ): void { self::row( Lms::COURSE_COMPLETED, 'User %1$s completed course "%2$s"', $student_id, $course_id, 'course_id' ); } /** * @param mixed $student_id The student. * @param mixed $quiz_id The quiz. * @param mixed $attempt The LLMS_Quiz_Attempt. */ public static function log_quiz_completed( $student_id, $quiz_id, $attempt = null ): void { $passed = is_object( $attempt ) && method_exists( $attempt, 'is_passing' ) && (bool) $attempt->is_passing(); $extra = array( 'passed' => $passed ); if ( is_object( $attempt ) && method_exists( $attempt, 'get' ) ) { $grade = Lms::score( $attempt->get( 'grade' ) ); if ( null !== $grade ) { $extra['grade'] = $grade; } } self::row( Lms::QUIZ_COMPLETED, $passed ? 'User %1$s passed quiz "%2$s"' : 'User %1$s did not pass quiz "%2$s"', $student_id, $quiz_id, 'quiz_id', $extra ); } /** * @param mixed $trigger What changed the enrolment. * @param mixed $new_status The status now. * @return array */ private static function why( $trigger, $new_status ): array { $out = array(); if ( is_scalar( $trigger ) && '' !== (string) $trigger ) { $out['trigger'] = Forms::status( $trigger ); } if ( is_scalar( $new_status ) && '' !== (string) $new_status ) { $out['status'] = Forms::status( $new_status ); } return $out; } /** * @param string $type Event type. * @param string $format Summary format. * @param mixed $user_id The student. * @param mixed $object_id The course, quiz or membership. * @param string $id_key Its details key. * @param array $extra More details. */ private static function row( string $type, string $format, $user_id, $object_id, string $id_key, array $extra = array() ): void { $object = People::id( $object_id ); if ( $object <= 0 ) { return; } People::log( $type, $format, People::id( $user_id ), People::post_title( $object ), array( 'plugin' => self::PLUGIN, $id_key => $object, ) + $extra ); } }