$response Heartbeat response. * @param array $data Heartbeat request data. * @return array */ public static function on_heartbeat_received( array $response, array $data ): array { if ( is_user_logged_in() && is_admin() ) { self::record_activity_for_user( get_current_user_id() ); } return $response; } /** * Update last admin activity for a user if throttle allows. * * @param int $user_id User ID. */ private static function record_activity_for_user( int $user_id ): void { if ( $user_id <= 0 ) { return; } $throttle_key = 'actlogpro_admin_act_' . $user_id; if ( get_transient( $throttle_key ) ) { return; } update_user_meta( $user_id, self::USER_META_KEY, time() ); set_transient( $throttle_key, 1, self::THROTTLE_SECONDS ); } /** * Get configured active threshold in minutes. */ public static function get_threshold_minutes(): int { $minutes = (int) get_option( self::THRESHOLD_OPTION, self::DEFAULT_THRESHOLD_MINUTES ); if ( ! in_array( $minutes, self::ALLOWED_THRESHOLDS, true ) ) { $minutes = self::DEFAULT_THRESHOLD_MINUTES; } return $minutes; } /** * Sanitize and validate a threshold value for saving. * * @param int $minutes Raw minutes value. * @return int */ public static function sanitize_threshold_minutes( int $minutes ): int { return in_array( $minutes, self::ALLOWED_THRESHOLDS, true ) ? $minutes : self::DEFAULT_THRESHOLD_MINUTES; } /** * Get activity status for display in Live Sessions. * * @param int $user_id User ID. * @return array{status: string, label: string, last_activity: int, tooltip: string} */ public static function get_status_for_user( int $user_id ): array { $threshold = self::get_threshold_minutes() * MINUTE_IN_SECONDS; $last = (int) get_user_meta( $user_id, self::USER_META_KEY, true ); $now = time(); $is_active = $last > 0 && ( $now - $last ) <= $threshold; if ( $is_active ) { $mins_ago = max( 0, (int) floor( ( $now - $last ) / 60 ) ); $tooltip = $mins_ago < 1 ? __( 'Active in dashboard · just now', 'activity-log-pro' ) : sprintf( /* translators: %d: minutes ago */ __( 'Active in dashboard · %d min ago', 'activity-log-pro' ), $mins_ago ); return [ 'status' => 'active', 'label' => __( 'Active', 'activity-log-pro' ), 'last_activity' => $last, 'tooltip' => $tooltip, ]; } if ( $last > 0 ) { $tooltip = sprintf( /* translators: %s: human-readable time difference */ __( 'Logged in · last seen in dashboard %s ago', 'activity-log-pro' ), human_time_diff( $last, $now ) ); } else { $tooltip = __( 'Logged in · no recent dashboard activity recorded', 'activity-log-pro' ); } return [ 'status' => 'idle', 'label' => __( 'Idle', 'activity-log-pro' ), 'last_activity' => $last, 'tooltip' => $tooltip, ]; } }