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;