diff -r c7c0fbc09788 -r 5e8dcbe22c24 web/wp-content/plugins/bbpress/includes/extend/buddypress/activity.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/wp-content/plugins/bbpress/includes/extend/buddypress/activity.php Tue Dec 04 18:43:10 2012 -0800 @@ -0,0 +1,708 @@ +setup_globals(); + $this->setup_actions(); + $this->setup_filters(); + $this->fully_loaded(); + } + + /** + * Extension variables + * + * @since bbPress (r3395) + * @access private + * @uses apply_filters() Calls various filters + */ + private function setup_globals() { + + // The name of the BuddyPress component, used in activity streams + $this->component = 'bbpress'; + + // Forums + $this->forum_create = 'bbp_forum_create'; + + // Topics + $this->topic_create = 'bbp_topic_create'; + $this->topic_edit = 'bbp_topic_edit'; + $this->topic_close = 'bbp_topic_close'; + $this->topic_open = 'bbp_topic_open'; + + // Replies + $this->reply_create = 'bbp_reply_create'; + $this->reply_edit = 'bbp_reply_edit'; + } + + /** + * Setup the actions + * + * @since bbPress (r3395) + * @access private + * @uses add_filter() To add various filters + * @uses add_action() To add various actions + */ + private function setup_actions() { + + // Register the activity stream actions + add_action( 'bp_register_activity_actions', array( $this, 'register_activity_actions' ) ); + + // Hook into topic and reply creation + add_action( 'bbp_new_topic', array( $this, 'topic_create' ), 10, 4 ); + add_action( 'bbp_new_reply', array( $this, 'reply_create' ), 10, 5 ); + + // Hook into topic and reply status changes + add_action( 'wp_insert_post', array( $this, 'topic_update' ), 10, 2 ); + add_action( 'wp_insert_post', array( $this, 'reply_update' ), 10, 2 ); + + // Hook into topic and reply deletion + add_action( 'bbp_delete_topic', array( $this, 'topic_delete' ), 10, 1 ); + add_action( 'bbp_delete_reply', array( $this, 'reply_delete' ), 10, 1 ); + + // Append forum filters in site wide activity streams + add_action( 'bp_activity_filter_options', array( $this, 'activity_filter_options' ), 10 ); + + // Append forum filters in single member activity streams + add_action( 'bp_member_activity_filter_options', array( $this, 'activity_filter_options' ), 10 ); + + // Append forum filters in single group activity streams + add_action( 'bp_group_activity_filter_options', array( $this, 'activity_filter_options' ), 10 ); + } + + /** + * Setup the filters + * + * @since bbPress (r3395) + * @access private + * @uses add_filter() To add various filters + * @uses add_action() To add various actions + */ + private function setup_filters() { + + /** Activity **********************************************************/ + + // Obey BuddyPress commenting rules + add_filter( 'bp_activity_can_comment', array( $this, 'activity_can_comment' ) ); + + // Link directly to the topic or reply + add_filter( 'bp_activity_get_permalink', array( $this, 'activity_get_permalink' ), 10, 2 ); + + /** Mentions **********************************************************/ + + // Convert mentions into links on create + add_filter( 'bbp_new_topic_pre_content', 'bp_activity_at_name_filter' ); + add_filter( 'bbp_new_reply_pre_content', 'bp_activity_at_name_filter' ); + + // Convert mentions into links on edit + add_filter( 'bbp_edit_topic_pre_content', 'bp_activity_at_name_filter' ); + add_filter( 'bbp_edit_reply_pre_content', 'bp_activity_at_name_filter' ); + + // Revert links into text on edit + add_filter( 'bbp_get_form_topic_content', array( $this, 'strip_mentions_on_edit' ) ); + add_filter( 'bbp_get_form_reply_content', array( $this, 'strip_mentions_on_edit' ) ); + } + + /** + * Allow the variables, actions, and filters to be modified by third party + * plugins and themes. + * + * @since bbPress (r3902) + */ + private function fully_loaded() { + do_action_ref_array( 'bbp_buddypress_activity_loaded', array( $this ) ); + } + + /** Methods ***************************************************************/ + + /** + * Strip out BuddyPress activity at-name HTML on topic/reply edit + * + * Copied from bp_forums_strip_mentions_on_post_edit() in case forums + * component is not active or is not loaded in yet. + * + * @since bbPress (r3475) + * @param type $content Optional + * @uses bp_get_root_domain() + * @uses bp_get_members_root_slug() + * @return string + */ + public function strip_mentions_on_edit( $content = '' ) { + + // Backwards compat for members root slug + if ( function_exists( 'bp_get_members_root_slug' ) ) { + $members_root = bp_get_members_root_slug(); + } elseif ( defined( 'BP_MEMBERS_SLUG' ) ) { + $members_root = BP_MEMBERS_SLUG; + } else { + $members_root = 'members'; + } + + $pattern = "|(@[A-Za-z0-9-_\.@]+)|"; + $content = preg_replace( $pattern, "$1", htmlspecialchars_decode( $content ) ); + + return $content; + } + + /** + * Register our activity actions with BuddyPress + * + * @since bbPress (r3395) + * @uses bp_activity_set_action() + */ + public function register_activity_actions() { + bp_activity_set_action( $this->component, $this->topic_create, __( 'New topic created', 'bbpress' ) ); + bp_activity_set_action( $this->component, $this->reply_create, __( 'New reply created', 'bbpress' ) ); + } + + /** + * Wrapper for recoding bbPress actions to the BuddyPress activity stream + * + * @since bbPress (r3395) + * @param type $args Array of arguments for bp_activity_add() + * @uses bbp_get_current_user_id() + * @uses bp_core_current_time() + * @uses bbp_parse_args() + * @uses aplly_filters() + * @uses bp_activity_add() + * @return type Activity ID if successful, false if not + */ + private function record_activity( $args = '' ) { + + // Default activity args + $defaults = array ( + 'id' => null, + 'user_id' => bbp_get_current_user_id(), + 'type' => '', + 'action' => '', + 'item_id' => '', + 'secondary_item_id' => '', + 'content' => '', + 'primary_link' => '', + 'component' => $this->component, + 'recorded_time' => bp_core_current_time(), + 'hide_sitewide' => false + ); + $activity = bbp_parse_args( $args, $defaults, 'record_activity' ); + + // Add the activity + return bp_activity_add( $activity ); + } + + /** + * Wrapper for deleting bbPress actions from BuddyPress activity stream + * + * @since bbPress (r3395) + * @param type $args Array of arguments for bp_activity_add() + * @uses bbp_get_current_user_id() + * @uses bp_core_current_time() + * @uses bbp_parse_args() + * @uses aplly_filters() + * @uses bp_activity_add() + * @return type Activity ID if successful, false if not + */ + public function delete_activity( $args = '' ) { + + // Default activity args + $defaults = array( + 'item_id' => false, + 'component' => $this->component, + 'type' => false, + 'user_id' => false, + 'secondary_item_id' => false + ); + $activity = bbp_parse_args( $args, $defaults, 'delete_activity' ); + + // Delete the activity + bp_activity_delete_by_item_id( $activity ); + } + + /** + * Check for an existing activity stream entry for a given post_id + * + * @param int $post_id ID of the topic or reply + * @uses get_post_meta() + * @uses bp_activity_get_specific() + * @return int if an activity id is verified, false if not + */ + private static function get_activity_id( $post_id = 0 ) { + + // Try to get the activity ID of the post + $activity_id = (int) get_post_meta( $post_id, '_bbp_activity_id', true ); + + // Bail if no activity ID is in post meta + if ( empty( $activity_id ) ) + return null; + + // Get the activity stream item, bail if it doesn't exist + $existing = bp_activity_get_specific( array( 'activity_ids' => $activity_id, 'show_hidden' => true, 'spam' => 'all', ) ); + if ( empty( $existing['total'] ) || ( 1 != $existing['total'] ) ) + return null; + + // Return the activity ID since we've verified the connection + return $activity_id; + } + + /** + * Maybe disable activity stream comments on select actions + * + * @since bbPress (r3399) + * @global BP_Activity_Template $activities_template + * @param boolean $can_comment + * @uses bp_get_activity_action_name() + * @return boolean + */ + public function activity_can_comment( $can_comment = true ) { + global $activities_template; + + // Already forced off, so comply + if ( false === $can_comment ) + return $can_comment; + + // Check if blog & forum activity stream commenting is off + if ( ( false === $activities_template->disable_blogforum_replies ) || (int) $activities_template->disable_blogforum_replies ) { + + // Get the current action name + $action_name = bp_get_activity_action_name(); + + // Setup the array of possibly disabled actions + $disabled_actions = array( + $this->topic_create, + $this->reply_create + ); + + // Check if this activity stream action is disabled + if ( in_array( $action_name, $disabled_actions ) ) { + $can_comment = false; + } + } + + return $can_comment; + } + + /** + * Maybe link directly to topics and replies in activity stream entries + * + * @since bbPress (r3399) + * @param string $link + * @param mixed $activity_object + * @return string The link to the activity stream item + */ + public function activity_get_permalink( $link = '', $activity_object = false ) { + + // Setup the array of actions to link directly to + $disabled_actions = array( + $this->topic_create, + $this->reply_create + ); + + // Check if this activity stream action is directly linked + if ( in_array( $activity_object->type, $disabled_actions ) ) { + $link = $activity_object->primary_link; + } + + return $link; + } + + /** + * Append forum options to activity filter select box + * + * @since bbPress (r3653) + */ + function activity_filter_options() { + ?> + + + + + ' . $topic_title . ''; + + // Forum + $forum_permalink = bbp_get_forum_permalink( $forum_id ); + $forum_title = bbp_get_forum_title ( $forum_id ); + $forum_link = '' . $forum_title . ''; + + // Activity action & text + $activity_text = sprintf( __( '%1$s started the topic %2$s in the forum %3$s', 'bbpress' ), $user_link, $topic_link, $forum_link ); + $activity_action = apply_filters( 'bbp_activity_topic_create', $activity_text, $user_id, $topic_id, $forum_id ); + $activity_content = apply_filters( 'bbp_activity_topic_create_excerpt', bp_create_excerpt( $topic_content ), $topic_content ); + + // Compile the activity stream results + $activity = array( + 'id' => $this->get_activity_id( $topic_id ), + 'user_id' => $user_id, + 'action' => $activity_action, + 'content' => $activity_content, + 'primary_link' => $topic_permalink, + 'type' => $this->topic_create, + 'item_id' => $topic_id, + 'secondary_item_id' => $forum_id, + 'recorded_time' => get_post_time( 'Y-m-d H:i:s', true, $topic_id ), + ); + + // Record the activity + $activity_id = $this->record_activity( $activity ); + + // Add the activity entry ID as a meta value to the topic + if ( !empty( $activity_id ) ) { + update_post_meta( $topic_id, '_bbp_activity_id', $activity_id ); + } + } + + /** + * Delete the activity stream entry when a topic is spammed, trashed, or deleted + * + * @param int $topic_id + * @uses bp_activity_delete() + */ + public function topic_delete( $topic_id ) { + + // Get activity ID, bail if it doesn't exist + if ( $activity_id = $this->get_activity_id( $topic_id ) ) + return bp_activity_delete( array( 'id' => $activity_id ) ); + + return false; + } + + /** + * Update the activity stream entry when a topic status changes + * + * @param int $post_id + * @param obj $post + * @uses get_post_type() + * @uses bbp_get_topic_post_type() + * @uses bbp_get_topic_id() + * @uses bbp_is_topic_anonymous() + * @uses bbp_get_public_status_id() + * @uses bbp_get_closed_status_id() + * @uses bbp_get_topic_forum_id() + * @uses bbp_get_topic_author_id() + * @return Bail early if not a topic, or topic is by anonymous user + */ + public function topic_update( $topic_id, $post ) { + + // Bail early if not a topic + if ( get_post_type( $post ) != bbp_get_topic_post_type() ) + return; + + $topic_id = bbp_get_topic_id( $topic_id ); + + // Bail early if topic is by anonymous user + if ( bbp_is_topic_anonymous( $topic_id ) ) + return; + + $anonymous_data = array(); + + // Action based on new status + if ( in_array( $post->post_status, array( bbp_get_public_status_id(), bbp_get_closed_status_id() ) ) ) { + + // Validate topic data + $forum_id = bbp_get_topic_forum_id( $topic_id ); + $topic_author_id = bbp_get_topic_author_id( $topic_id ); + + $this->topic_create( $topic_id, $forum_id, $anonymous_data, $topic_author_id ); + } else { + $this->topic_delete( $topic_id ); + } + } + + /** Replies ***************************************************************/ + + /** + * Record an activity stream entry when a reply is created + * + * @since bbPress (r3395) + * @param int $topic_id + * @param int $forum_id + * @param array $anonymous_data + * @param int $topic_author_id + * @uses bbp_get_reply_id() + * @uses bbp_get_topic_id() + * @uses bbp_get_forum_id() + * @uses bbp_get_user_profile_link() + * @uses bbp_get_reply_url() + * @uses bbp_get_reply_content() + * @uses bbp_get_topic_permalink() + * @uses bbp_get_topic_title() + * @uses bbp_get_forum_permalink() + * @uses bbp_get_forum_title() + * @uses bp_create_excerpt() + * @uses apply_filters() + * @return Bail early if topic is by anonywous user + */ + public function reply_create( $reply_id, $topic_id, $forum_id, $anonymous_data, $reply_author_id ) { + + // Do not log activity of anonymous users + if ( !empty( $anonymous_data ) ) + return; + + // Bail if site is private + if ( !bbp_is_site_public() ) + return; + + // Validate activity data + $user_id = $reply_author_id; + $reply_id = bbp_get_reply_id( $reply_id ); + $topic_id = bbp_get_topic_id( $topic_id ); + $forum_id = bbp_get_forum_id( $forum_id ); + + // Bail if user is not active + if ( bbp_is_user_inactive( $user_id ) ) + return; + + // Bail if reply is not published + if ( !bbp_is_reply_published( $reply_id ) ) + return; + + // Bail if forum is not public + if ( !bbp_is_forum_public( $forum_id, false ) ) + return; + + // Setup links for activity stream + $user_link = bbp_get_user_profile_link( $user_id ); + + // Reply + $reply_url = bbp_get_reply_url ( $reply_id ); + $reply_content = bbp_get_reply_content( $reply_id ); + + // Topic + $topic_permalink = bbp_get_topic_permalink( $topic_id ); + $topic_title = bbp_get_topic_title ( $topic_id ); + $topic_link = '' . $topic_title . ''; + + // Forum + $forum_permalink = bbp_get_forum_permalink( $forum_id ); + $forum_title = bbp_get_forum_title ( $forum_id ); + $forum_link = '' . $forum_title . ''; + + // Activity action & text + $activity_text = sprintf( __( '%1$s replied to the topic %2$s in the forum %3$s', 'bbpress' ), $user_link, $topic_link, $forum_link ); + $activity_action = apply_filters( 'bbp_activity_reply_create', $activity_text, $user_id, $reply_id, $topic_id ); + $activity_content = apply_filters( 'bbp_activity_reply_create_excerpt', bp_create_excerpt( $reply_content ), $reply_content ); + + // Compile the activity stream results + $activity = array( + 'id' => $this->get_activity_id( $reply_id ), + 'user_id' => $user_id, + 'action' => $activity_action, + 'content' => $activity_content, + 'primary_link' => $reply_url, + 'type' => $this->reply_create, + 'item_id' => $reply_id, + 'secondary_item_id' => $topic_id, + 'recorded_time' => get_post_time( 'Y-m-d H:i:s', true, $reply_id ), + ); + + // Record the activity + $activity_id = $this->record_activity( $activity ); + + // Add the activity entry ID as a meta value to the reply + if ( !empty( $activity_id ) ) { + update_post_meta( $reply_id, '_bbp_activity_id', $activity_id ); + } + } + + /** + * Delete the activity stream entry when a reply is spammed, trashed, or deleted + * + * @param int $reply_id + * @uses get_post_meta() + * @uses bp_activity_delete() + */ + public function reply_delete( $reply_id ) { + + // Get activity ID, bail if it doesn't exist + if ( $activity_id = $this->get_activity_id( $reply_id ) ) + return bp_activity_delete( array( 'id' => $activity_id ) ); + + return false; + } + + /** + * Update the activity stream entry when a reply status changes + * + * @param int $post_id + * @param obj $post + * @uses get_post_type() + * @uses bbp_get_reply_post_type() + * @uses bbp_get_reply_id() + * @uses bbp_is_reply_anonymous() + * @uses bbp_get_public_status_id() + * @uses bbp_get_closed_status_id() + * @uses bbp_get_reply_topic_id() + * @uses bbp_get_reply_forum_id() + * @uses bbp_get_reply_author_id() + * @return Bail early if not a reply, or reply is by anonymous user + */ + public function reply_update( $reply_id, $post ) { + + // Bail early if not a reply + if ( get_post_type( $post ) != bbp_get_reply_post_type() ) + return; + + $reply_id = bbp_get_reply_id( $reply_id ); + + // Bail early if reply is by anonymous user + if ( bbp_is_reply_anonymous( $reply_id ) ) + return; + + $anonymous_data = array(); + + // Action based on new status + if ( $post->post_status == bbp_get_public_status_id() ) { + + // Validate reply data + $topic_id = bbp_get_reply_topic_id( $reply_id ); + $forum_id = bbp_get_reply_forum_id( $reply_id ); + $reply_author_id = bbp_get_reply_author_id( $reply_id ); + + $this->reply_create( $reply_id, $topic_id, $forum_id, $anonymous_data, $reply_author_id ); + } else { + $this->reply_delete( $reply_id ); + } + } +} +endif;