/** * Handle each of our LearnDash triggers * * @since 1.0.0 */ function badgeos_learndash_trigger_event() { // Setup all our important variables global $blog_id, $wpdb; // Setup args $args = func_get_args(); $userID = get_current_user_id(); if (is_array($args) && isset($args['user'])) { if (is_object($args['user'])) { $userID = (int) $args['user']->ID; } else { $userID = (int) $args['user']; } } if (empty($userID)) { return; } $user_data = get_user_by('id', $userID); if (empty($user_data)) { return; } // Grab the current trigger $this_trigger = current_filter(); // Update hook count for this user $new_count = badgeos_update_user_trigger_count($userID, $this_trigger, $blog_id); // Mark the count in the log entry badgeos_post_log_entry(null, $userID, null, sprintf(__('%1$s triggered %2$s (%3$dx)', 'badgeos'), $user_data->user_login, $this_trigger, $new_count)); // Now determine if any badges are earned based on this trigger event $triggered_achievements = $wpdb->get_results($wpdb->prepare("\n\t\tSELECT post_id\n\t\tFROM {$wpdb->postmeta}\n\t\tWHERE meta_key = '_badgeos_learndash_trigger'\n\t\t\t\tAND meta_value = %s\n\t\t", $this_trigger)); foreach ($triggered_achievements as $achievement) { badgeos_maybe_award_achievement_to_user($achievement->post_id, $userID, $this_trigger, $blog_id, $args); } }
/** * Handle each of our activity triggers * * @since 1.0.0 * @return mixed */ function badgeos_trigger_event() { // Setup all our globals global $user_ID, $blog_id, $wpdb; $site_id = $blog_id; $args = func_get_args(); // Grab our current trigger $this_trigger = current_filter(); // Grab the user ID $user_id = badgeos_trigger_get_user_id($this_trigger, $args); $user_data = get_user_by('id', $user_id); // Sanity check, if we don't have a user object, bail here if (!is_object($user_data)) { return $args[0]; } // If the user doesn't satisfy the trigger requirements, bail here if (!apply_filters('badgeos_user_deserves_trigger', true, $user_id, $this_trigger, $site_id, $args)) { return $args[0]; } // Update hook count for this user $new_count = badgeos_update_user_trigger_count($user_id, $this_trigger, $site_id, $args); // Mark the count in the log entry badgeos_post_log_entry(null, $user_id, null, sprintf(__('%1$s triggered %2$s (%3$dx)', 'badgeos'), $user_data->user_login, $this_trigger, $new_count)); // Now determine if any badges are earned based on this trigger event $triggered_achievements = $wpdb->get_results($wpdb->prepare("\n\t\tSELECT post_id\n\t\tFROM {$wpdb->postmeta}\n\t\tWHERE meta_key = '_badgeos_trigger_type'\n\t\t AND meta_value = %s\n\t\t", $this_trigger)); foreach ($triggered_achievements as $achievement) { badgeos_maybe_award_achievement_to_user($achievement->post_id, $user_id, $this_trigger, $site_id, $args); } return $args[0]; }
/** * Posts a log entry when a user earns points * * @since 1.0.0 * @param integer $user_id The given user's ID * @param integer $new_points The new points the user is being awarded * @param integer $admin_id If being awarded by an admin, the admin's user ID * @param integer $achievement_id The achievement that generated the points, if applicable * @return integer The user's updated point total */ function badgeos_update_users_points($user_id = 0, $new_points = 0, $admin_id = 0, $achievement_id = null) { // Use current user's ID if none specified if (!$user_id) { $user_id = get_current_user_id(); } // Grab the user's current points $current_points = badgeos_get_users_points($user_id); // If we're getting an admin ID, $new_points is actually the final total, so subtract the current points if ($admin_id) { $new_points = $new_points - $current_points; } // Update our user's total $total_points = max($current_points + $new_points, 0); update_user_meta($user_id, '_badgeos_points', $total_points); // Available action for triggering other processes do_action('badgeos_update_users_points', $user_id, $new_points, $total_points, $admin_id, $achievement_id); // Maybe award some points-based badges foreach (badgeos_get_points_based_achievements() as $achievement) { badgeos_maybe_award_achievement_to_user($achievement->ID, $user_id); } return $total_points; }
/** * Award additional achievements to user * * @since 1.0.0 * @param integer $user_id The given user's ID * @param integer $achievement_id The given achievement's post ID * @return void */ function badgeos_maybe_award_additional_achievements_to_user($user_id = 0, $achievement_id = 0) { // Get achievements that can be earned from completing this achievement $dependent_achievements = badgeos_get_dependent_achievements($achievement_id); // Loop through each dependent achievement and see if it can be awarded foreach ($dependent_achievements as $achievement) { badgeos_maybe_award_achievement_to_user($achievement->ID, $user_id); } // See if a user has unlocked all achievements of a given type badgeos_maybe_trigger_unlock_all($user_id, $achievement_id); }
/** * Filter submission messages and send one for Nomination Approval * * @param array $messages Messages to send * @param array $args Submission Args */ function badgeos_set_submission_status_nomination_approved($messages, $args) { // Award achievement badgeos_maybe_award_achievement_to_user($args['achievement_id'], $args['user_id']); // Check if user can be notified if (!badgeos_can_notify_user($args['user_data']->ID)) { return $messages; } $email = $args['user_data']->user_email; $message_id = 'badgeos_nomination_approved'; if ($args['auto']) { $message_id = 'badgeos_nomination_auto_approved'; $email = $args['submission_email_addresses']; $subject = sprintf(__('Approved Nomination: %1$s from %2$s', 'badgeos'), get_the_title($args['achievement_id']), $args['user_data']->display_name); // set the email message $message = sprintf(__('A new nomination has been received and auto-approved: In response to: %1$s Nominee: %2$s Nominated by: %3$s To view all nominations, including this one, visit: %4$s', 'badgeos'), get_the_title($args['achievement_id']), $args['user_data']->display_name, $args['from_user_data']->display_name, admin_url('edit.php?post_type=nomination')); // @todo set $email based on nominee and nominated by } else { $subject = sprintf(__('Nomination Approved: %s', 'badgeos'), get_the_title($args['achievement_id'])); // set the email message $message = sprintf(__('Your nomination has been approved: In response to: %1$s Nominee: %2$s Nominated by: %3$s %4$s', 'badgeos'), get_the_title($args['achievement_id']), $args['user_data']->display_name, $args['from_user_data']->display_name, get_permalink($args['achievement_id'])); // @todo set $email based on nominee and nominated by } $messages[$message_id] = array('email' => $email, 'subject' => $subject, 'message' => $message); return $messages; }