Sid Gifari File Manager
🏠 Root
/
home
/
genremedia08
/
thepassage.overlookedtracks.com
/
wp-content9
/
plugins
/
bp-better-messages
/
inc
/
Editing: functions.php
<?php defined( 'ABSPATH' ) || exit; if ( !class_exists( 'Better_Messages_Functions' ) ): class Better_Messages_Functions { private $multisite_resolved = null; public static function instance() { static $instance = null; if ( null === $instance ) { $instance = new Better_Messages_Functions(); } return $instance; } public function can_send_message_filter( $allowed, $user_id, $thread_id ){ $legacy = apply_filters('bp_better_messages_can_send_message', $allowed, $user_id, $thread_id ); return apply_filters('better_messages_can_send_message', $legacy, $user_id, $thread_id ); } public function before_new_thread_filter( &$args, &$errors ){ do_action_ref_array( 'bp_better_messages_before_new_thread', array( &$args, &$errors )); do_action_ref_array( 'better_messages_before_new_thread', array( &$args, &$errors )); } public function before_message_send_filter( &$args, &$errors ){ do_action_ref_array( 'bp_better_messages_before_message_send', array( &$args, &$errors )); do_action_ref_array( 'better_messages_before_message_send', array( &$args, &$errors )); } /** * @param int $user_id * @param string $subject * @param string $message * @param bool $fast_start * @param bool $scrollToContainer * @return string * * @since 2.0.60 */ public function create_conversation_link( int $user_id, string $subject = '', string $message = '', bool $fast_start = false, bool $scrollToContainer = true ): string { $args = [ 'to' => $user_id ]; if( ! empty($subject) ) { $args['subject'] = $subject; } if( ! empty($message) ) { $args['message'] = $message; } if( $scrollToContainer ) { $args['scrollToContainer'] = ''; } if( $fast_start ){ $args['bm-fast-start'] = '1'; return add_query_arg($args, Better_Messages()->functions->get_link( Better_Messages()->functions->get_current_user_id() )); } else { return Better_Messages()->functions->add_hash_arg('new-conversation', $args, Better_Messages()->functions->get_link( Better_Messages()->functions->get_current_user_id() )); } } /** * @param int $user_id * @return string * * @since 2.0.60 */ public function private_message_link(int $user_id ): string { return $this->create_conversation_link( $user_id, '', '', Better_Messages()->settings['fastStart'] == '1' ); } /** * @param int $thread_id * @param int $user_id * @return string * * @since 2.0.63 */ public function get_user_messages_url( int $user_id, ?int $thread_id = null ): string { if( $thread_id ) { return Better_Messages()->functions->add_hash_arg('conversation/' . $thread_id, [ 'scrollToContainer' => '' ], Better_Messages()->functions->get_link($user_id)); } else { return Better_Messages()->functions->add_hash_arg('', [ 'scrollToContainer' => '' ], Better_Messages()->functions->get_link($user_id) ); } } /** * @param $user_id * @param $thread_id * @return array|string[] */ public function can_reply_in_conversation($user_id, $thread_id ): array { $can_send = $this->can_send_message_filter( Better_Messages()->functions->check_access( $thread_id ), $user_id, $thread_id ); if( $can_send ){ return [ 'result' => 'allowed' ]; } else { $_errors = []; global $bp_better_messages_restrict_send_message; if( count($bp_better_messages_restrict_send_message) > 0 ){ foreach( $bp_better_messages_restrict_send_message as $error ){ $_errors[] = $error; } } return [ 'result' => 'not_allowed', 'errors' => $_errors ]; } } /** * @param $starter_id * @param array $recipients * @return array */ public function can_start_conversation($starter_id, array $recipients = [], $uniqueKey = null ): array { $args = array( 'sender_id' => $starter_id, 'new_thread' => true, 'error_type' => 'wp_error', 'append_thread' => false, 'recipients' => $recipients ); if( $uniqueKey ){ $args['unique_key'] = $uniqueKey; if( Better_Messages()->settings['singleThreadMode'] == '1' ) { remove_action( 'better_messages_before_new_thread', array( Better_Messages_Hooks::instance(), 'disable_start_thread_if_thread_exist' ), 10, 2 ); } } Better_Messages()->functions->before_new_thread_filter( $args, $errors ); if( $uniqueKey ){ if( Better_Messages()->settings['singleThreadMode'] == '1' ) { add_action( 'better_messages_before_new_thread', array( Better_Messages_Hooks::instance(), 'disable_start_thread_if_thread_exist' ), 10, 2 ); } } if( empty( $errors ) ){ return [ 'result' => 'new_thread' ]; } else { $_errors = []; foreach( $errors as $error ){ $_errors[] = $error; } return [ 'result' => 'not_allowed', 'errors' => $_errors ]; } } public function can_erase_thread( $user_id, $thread_id ){ $can_erase = false; if( user_can( $user_id, 'bm_can_administrate' ) ){ $can_erase = true; } return apply_filters( 'bp_better_messages_can_erase_thread', $can_erase, $user_id, $thread_id ); } public function can_clear_thread( $user_id, $thread_id ){ $can_erase = false; if( user_can( $user_id, 'bm_can_administrate' ) ){ $can_erase = true; } return apply_filters( 'bp_better_messages_can_clear_thread', $can_erase, $user_id, $thread_id ); } public function can_invite( $user_id, $thread_id ){ $type = $this->get_thread_type( $thread_id ); if( $type === 'chat-room' ) return false; if( $type === 'group' ) return false; if( $user_id <= 0 ) return false; $participants = $this->get_participants( $thread_id ); $is_moderator = Better_Messages()->functions->is_thread_super_moderator( $user_id, $thread_id ); if( count($participants['recipients']) >= 1 ) { $allow_invite = ( Better_Messages()->functions->get_thread_meta($thread_id, 'allow_invite') === 'yes' ); if ($is_moderator || $allow_invite) { return apply_filters( 'better_messages_can_invite', true, $user_id, $thread_id ); } } if( count($participants['recipients']) === 1 ) { $allow_invite = (Better_Messages()->settings['privateThreadInvite'] === '1'); if ( current_user_can('manage_options') || $is_moderator || $allow_invite ) { return apply_filters( 'better_messages_can_invite', true, $user_id, $thread_id ); } } return apply_filters( 'better_messages_can_invite', false, $user_id, $thread_id ); } public function can_leave( $user_id, $thread_id ): bool { $type = $this->get_thread_type( $thread_id ); if( $type === 'chat-room' ) return false; if( $type === 'group' ) return false; if( Better_Messages()->settings['allowGroupLeave'] === '1' ) { $participants = $this->get_participants( $thread_id ); if( $participants['count'] > 2 ) { return true; } } return false; } public function erase_thread( $thread_id ){ global $wpdb; $message_ids = $wpdb->get_col($wpdb->prepare("SELECT id FROM " . bm_get_table('messages') . " WHERE `thread_id` = %d", $thread_id)); if( count( $message_ids ) > 0 ){ foreach ( $message_ids as $message_id ) { Better_Messages()->functions->delete_message($message_id, $thread_id, false, 'delete'); } } Better_Messages()->hooks->clean_thread_cache( $thread_id ); $wpdb->query($wpdb->prepare("DELETE FROM " . bm_get_table('threadsmeta') . " WHERE `bm_thread_id` = %d", $thread_id)); $wpdb->query($wpdb->prepare("DELETE FROM " . bm_get_table('recipients') . " WHERE `thread_id` = %d", $thread_id)); $wpdb->query($wpdb->prepare("DELETE FROM " . bm_get_table('threads') . " WHERE `id` = %d", $thread_id)); $wpdb->query($wpdb->prepare("DELETE FROM " . bm_get_table('threadsmeta') . " WHERE `bm_thread_id` = %d", $thread_id)); Better_Messages()->functions->update_thread_meta( $thread_id, 'bm_last_update', Better_Messages()->functions->get_microtime() ); do_action( 'better_messages_thread_updated', $thread_id ); do_action( 'better_messages_thread_erased', $thread_id ); } public function clear_thread( $thread_id ){ // Can be alot of messages! set_time_limit(0); global $wpdb; $message_ids = $wpdb->get_col($wpdb->prepare("SELECT id FROM " . bm_get_table('messages') . " WHERE `thread_id` = %d", $thread_id)); if( count( $message_ids ) > 0 ){ foreach ( $message_ids as $message_id ) { Better_Messages()->functions->delete_message( $message_id, $thread_id, false, 'delete' ); } } $time = bp_core_current_time(); // Updating users unread counters in local db $wpdb->prepare( "UPDATE " . bm_get_table('recipients') . " SET unread_count = 0, last_read = %s, last_delivered = %s WHERE thread_id = %d", $time, $time, $thread_id ); do_action( 'better_messages_thread_updated', $thread_id ); do_action( 'better_messages_thread_cleared', $thread_id ); } public function delete_message( $message_id, $thread_id = false, $update_thread = true, $deleteMethod = null ){ global $wpdb; if( ! $deleteMethod ) { $deleteMethod = Better_Messages()->settings['deleteMethod']; } do_action( 'better_messages_before_message_delete', $message_id, $thread_id, $deleteMethod ); $sql = $wpdb->prepare("SELECT {$wpdb->posts}.ID FROM {$wpdb->posts} INNER JOIN {$wpdb->postmeta} ON ( {$wpdb->posts}.ID = {$wpdb->postmeta}.post_id ) INNER JOIN {$wpdb->postmeta} AS mt1 ON ( {$wpdb->posts}.ID = mt1.post_id ) WHERE 1=1 AND ( ( {$wpdb->postmeta}.meta_key = 'bp-better-messages-attachment' AND {$wpdb->postmeta}.meta_value = '1' ) AND ( mt1.meta_key = 'bp-better-messages-message-id' AND mt1.meta_value = %d ) ) AND {$wpdb->posts}.post_type = 'attachment' AND (({$wpdb->posts}.post_status = 'inherit')) GROUP BY {$wpdb->posts}.ID ORDER BY {$wpdb->posts}.post_date DESC", $message_id); $attachments = $wpdb->get_col( $sql ); foreach( $attachments as $attachment_id ){ $file_path = get_attached_file( $attachment_id ); wp_delete_attachment( $attachment_id, true ); if ( $file_path ) { Better_Messages()->files->cleanup_empty_directories( $file_path ); } } if( $deleteMethod === 'replace' ) { $message = new BM_Messages_Message( $message_id ); Better_Messages()->functions->update_message([ 'sender_id' => $message->sender_id, 'thread_id' => $thread_id, 'message_id' => $message_id, 'content' => '<!-- BM-DELETED-MESSAGE -->', 'send_push' => false, 'mobile_push' => false, 'count_unread' => false ]); } else { $time = Better_Messages()->functions->get_microtime(); $sql = $wpdb->prepare("UPDATE `" . bm_get_table('recipients') . "` SET unread_count = GREATEST(unread_count - 1, 0), last_update = %d WHERE `thread_id` = %d AND `last_read` < ( SELECT date_sent FROM `" . bm_get_table('messages') . "` WHERE `id` = %d )", $time, $thread_id, $message_id ); $wpdb->query( $sql ); $sql = $wpdb->prepare("DELETE FROM `" . bm_get_table('messages') . "` WHERE id = %d", $message_id); $wpdb->query($sql); $sql = $wpdb->prepare("DELETE FROM `" . bm_get_table('meta') . "` WHERE bm_message_id = %d", $message_id); $wpdb->query($sql); do_action('bp_better_messages_message_deleted', $message_id ); $this->update_message_update_time($message_id, false, true); } if( $update_thread ){ do_action( 'better_messages_thread_updated', $thread_id ); } return true; } public function get_user_unread_for_thread( $user_id, $thread_id ){ global $wpdb; return $wpdb->get_var( $wpdb->prepare(" SELECT unread_count FROM `" . bm_get_table('recipients') . "` WHERE `user_id` = %d AND `thread_id` = %d", $user_id, $thread_id ) ); } public function decrease_unread( $thread_id, $user_ids = [], $decrease_by = 1 ){ if( ! is_array( $user_ids ) ) { return false; } $user_ids = array_map('intval', $user_ids); if( count( $user_ids ) === 0 ){ return false; } global $wpdb; $time = Better_Messages()->functions->get_microtime(); $sql = $wpdb->prepare("UPDATE " . bm_get_table('recipients') . " SET unread_count = GREATEST(unread_count - %d, 0), last_update = %d WHERE `thread_id` = %d AND `user_id` IN (" . implode(',', $user_ids ) . ") ", $decrease_by, $time, $thread_id ); $wpdb->query( $sql ); return true; } public function is_thread_super_moderator($user_id, $thread_id, $include_admin = true ){ if( $include_admin && user_can( $user_id, 'bm_can_administrate') ) { return true; } $type = Better_Messages()->functions->get_thread_type( $thread_id ); if( $type === 'group' ) { if (function_exists('bp_get_user_groups')) { $group_id = Better_Messages()->functions->get_thread_meta($thread_id, 'group_id'); if (!!$group_id) { $user_groups = bp_get_user_groups($user_id, array( 'is_admin' => null, 'is_mod' => null, )); if (isset($user_groups[$group_id])) { if ($user_groups[$group_id]->is_admin || $user_groups[$group_id]->is_mod) { return true; } } return false; } } if (class_exists('PeepSoGroupsPlugin')) { $group_id = Better_Messages()->functions->get_thread_meta($thread_id, 'peepso_group_id'); if ( !! $group_id ) { return Better_Messages_Peepso_Groups::instance()->user_can_moderate( $group_id, $user_id ); } } if ( class_exists('UM_Groups')) { $group_id = Better_Messages()->functions->get_thread_meta($thread_id, 'um_group_id'); if ( !! $group_id ) { return Better_Messages_Ultimate_Member_Groups::instance()->user_can_moderate( $group_id, $user_id ); } } if( class_exists('Better_Messages_Fluent_Community_Spaces') ) { $group_id = Better_Messages()->functions->get_thread_meta($thread_id, 'fluentcommunity_group_id'); if( !! $group_id ){ return Better_Messages_Fluent_Community_Spaces::instance()->user_can_moderate( $group_id, $user_id ); } } } if( $type === 'thread' ) { $participants = Better_Messages()->functions->get_participants( $thread_id ); if( $participants['count'] > 2 ){ $moderators = Better_Messages()->functions->get_moderators( $thread_id ); if( count( $moderators ) > 0 ){ return in_array( intval($user_id), $moderators ); } else { global $wpdb; $admin_user = (int) $wpdb->get_var( $wpdb->prepare(" SELECT sender_id FROM `" . bm_get_table('messages') . "` WHERE `thread_id` = %d AND `sender_id` != '0' ORDER BY `" . bm_get_table('messages') . "`.`created_at` ASC LIMIT 0, 1 ", $thread_id )); Better_Messages()->functions->add_moderator( $thread_id, $admin_user ); if( intval($user_id) === $admin_user){ return true; } } } } return false; } public function is_thread_participant( $user_id, $thread_id, $include_deleted = false ){ global $wpdb; if( ! $include_deleted ) { $userIsParticipant = (bool)$wpdb->get_var($wpdb->prepare(" SELECT COUNT(*) FROM `" . bm_get_table('recipients') . "` WHERE `user_id` = %d AND `thread_id` = %d AND `is_deleted` = '0' ", $user_id, $thread_id)); } else { $userIsParticipant = (bool)$wpdb->get_var($wpdb->prepare(" SELECT COUNT(*) FROM `" . bm_get_table('recipients') . "` WHERE `user_id` = %d AND `thread_id` = %d ", $user_id, $thread_id)); } if( $userIsParticipant ){ return true; } return false; } public function get_thread_subject($thread_id){ global $wpdb; $subject = $wpdb->get_var( $wpdb->prepare( " SELECT subject FROM `" . bm_get_table('threads') . "` WHERE `id` = %d LIMIT 0, 1 ", $thread_id ) ); return $this->clean_no_subject( wp_unslash( esc_attr( $subject )) ); } public function change_thread_subject($thread_id, $new_subject){ global $wpdb; $wpdb->update( bm_get_table('threads'), array( 'subject' => $new_subject ), array( 'id' => $thread_id ), array( '%s' ), array( '%d' ) ); do_action( 'better_messages_thread_updated', $thread_id ); do_action( 'better_messages_info_changed', $thread_id ); return wp_unslash( esc_attr( $new_subject ) ); } /** * @param $user_id * @param $exclude_threads * @return array */ public function get_threads($user_id = false ) { if( $user_id === false ) $user_id = Better_Messages()->functions->get_current_user_id(); $data = Better_Messages()->api->get_threads( [], false, false, true, true, $user_id ); if( $data['threads'] ) { return $data['threads']; } return []; } public function get_thread_message_count($thread_id){ global $wpdb; return $wpdb->get_var( $wpdb->prepare( " SELECT COUNT(*) FROM " . bm_get_table('messages') . " WHERE `thread_id` = %d ", $thread_id ) ); } public function get_message( $message_id ){ global $wpdb; return $wpdb->get_row( $wpdb->prepare( " SELECT * FROM " . bm_get_table('messages') . " WHERE `id` = %d ", $message_id ) ); } public function get_messages( $thread_id, $message = false, $action = 'last_messages', $count = 50 ){ global $wpdb; $current_user_id = Better_Messages()->functions->get_current_user_id(); $pending_sql = user_can( $current_user_id, 'bm_can_administrate' ) ? "" : $wpdb->prepare(" AND ( `messages`.`is_pending` = 0 OR `messages`.`sender_id` = %d ) ", $current_user_id ); switch ($action){ case 'last_messages': $query = $wpdb->prepare( " SELECT id, thread_id, sender_id, message, created_at, updated_at, temp_id, is_pending FROM " . bm_get_table('messages') . " messages WHERE `thread_id` = %d $pending_sql ORDER BY `created_at` DESC LIMIT 0, %d ", $thread_id, $count ); break; case 'from_message': $query = $wpdb->prepare( " SELECT id, thread_id, sender_id, message, created_at, updated_at, temp_id, is_pending FROM " . bm_get_table('messages') . " messages WHERE `thread_id` = %d AND `id` <= %d $pending_sql ORDER BY `created_at` DESC LIMIT 0, %d ", $thread_id, $message, $count ); break; case 'to_message': $query = $wpdb->prepare( " SELECT id, thread_id, sender_id, message, created_at, updated_at, temp_id, is_pending FROM " . bm_get_table('messages') . " messages WHERE `thread_id` = %d AND `id` >= %d $pending_sql ORDER BY `created_at` DESC ", $thread_id, $message ); break; } return $wpdb->get_results( $query ); } public function is_message_starred( $message_id, $user_id ){ if( Better_Messages()->settings['disableFavoriteMessages'] === '0' ) { $starred = array_flip( (array) $this->get_message_meta( $message_id, 'starred_by_user', false ) ); return isset( $starred[ $user_id ] ); } else { return false; } } public function get_recipients( $thread_id = 0, $cache = true ) { global $wpdb; $thread_id = (int) $thread_id; $recipients = false; if( $cache ){ $recipients = wp_cache_get( 'bm_thread_recipients_' . $thread_id, 'bm_messages' ); } if ( false === $recipients ) { $recipients = array(); $sql = $wpdb->prepare(" SELECT `recipients`.* FROM " . bm_get_table('recipients') . " `recipients` LEFT JOIN " . $wpdb->users . " users ON `users`.`ID` = `recipients`.`user_id` WHERE `recipients`.`thread_id` = %d AND ( ( `recipients`.`user_id` >= 0 AND `users`.`ID` IS NOT NULL ) OR ( `recipients`.`user_id` < 0 ) )", $thread_id ); $results = $wpdb->get_results( $sql ); foreach ( (array) $results as $recipient ) { $recipients[ $recipient->user_id ] = $recipient; } wp_cache_set( 'bm_thread_recipients_' . $thread_id, $recipients, 'bm_messages' ); } // Cast all items from the messages DB table as integers. foreach ( (array) $recipients as $key => $data ) { $recipients[ $key ] = (object) array_map( 'intval', (array) $data ); } /** * Filters the recipients of a message thread. * * @param array $recipients Array of recipient objects. * @param int $thread_id ID of the current thread. */ return apply_filters( 'bm_messages_thread_get_recipients', $recipients, $thread_id ); } /** * Get all thread user ids including currently logged-in user * * @param int $thread_id * @param boolean $cache * @return array * * @since 2.0.55 */ public function get_recipients_ids( int $thread_id, bool $cache = true ): array { $recipients = $this->get_recipients( $thread_id, $cache ); if( count ( $recipients ) === 0 ) return []; $users_ids = []; foreach ( $recipients as $user_id => $_user ){ $users_ids[] = intval( $user_id ); } return array_unique( $users_ids ); } public function get_participants( $thread_id ) { $current_user_id = Better_Messages()->functions->get_current_user_id(); $recipients = $this->get_recipients( $thread_id ); $users = []; foreach ( $recipients as $user_id => $_user ){ $users[ $user_id ] = $user_id; } $participants = array( 'recipients' => $users, 'count' => count($recipients) ); if( isset( $participants['recipients'][$current_user_id]) ) { unset($participants['recipients'][$current_user_id]); } return $participants; } public function get_displayed_user_id(){ $current_user_id = Better_Messages()->functions->get_current_user_id(); if( doing_action('wp_ajax_buddyboss_theme_get_header_unread_messages') ){ $user_id = $current_user_id; } if ( ! isset( $user_id ) || $user_id == false ) { $user_id = bp_displayed_user_id(); } if ( ! isset( $user_id ) || $user_id == false ) { $user_id = $current_user_id; } return $user_id; } public function get_link( $user_id = false ) { if( ! is_user_logged_in() && ! Better_Messages()->notifications->is_sending_notifications() ) { if( ! is_numeric( Better_Messages()->settings['chatPage'] ) || Better_Messages()->settings['chatPage'] === '0' ) { return apply_filters( 'better_messages_login_url', wp_login_url( add_query_arg([]) ) ); } } $current_user_id = $this->get_displayed_user_id(); $slug = Better_Messages()->settings['bpProfileSlug']; if ( $user_id == false ) { $user_id = $current_user_id; } $url_overwritten = apply_filters( 'bp_better_messages_page', null, $user_id ); if( $url_overwritten !== null ){ return $url_overwritten; } if( is_user_logged_in() || Better_Messages()->notifications->is_sending_notifications() ) { if (class_exists('AsgarosForum') && Better_Messages()->settings['chatPage'] === 'asgaros-forum') { global $asgarosforum; $link = $asgarosforum->get_link('profile', $user_id) . 'messages/'; return $link; } if (class_exists('WooCommerce') && Better_Messages()->settings['chatPage'] === 'woocommerce') { $link = trailingslashit(get_permalink(get_option('woocommerce_myaccount_page_id'))) . $slug . '/'; return $link; } } if( Better_Messages()->settings['chatPage'] !== '0' ){ return get_permalink( Better_Messages()->settings['chatPage'] ); } if( is_user_logged_in() || wp_doing_cron() ) { if (class_exists('BuddyPress') && $user_id !== $current_user_id) { return $this->bp_core_get_user_domain($user_id) . $slug . '/'; } if ( class_exists('BuddyPress') ) { return $this->bp_core_get_user_domain($user_id) . $slug . '/'; } } return ''; } public function bp_core_get_user_domain( $user_id ) { if( function_exists('bp_members_get_user_url') ){ return trailingslashit( bp_members_get_user_url($user_id) ); } else { return trailingslashit( bp_core_get_user_domain($user_id) ); } } public function format_message( $message = '', $message_id = 0, $context = 'stack', $user_id = false ) { global $processedUrls; if ( !isset( $processedUrls ) ) $processedUrls = array(); $message = apply_filters( 'bp_better_messages_pre_format_message', $message, $message_id, $context, $user_id ); // Removing slashes //$message = wp_unslash( $message ); if ( $context == 'site' ) { $message = $this->truncate( $message, 100 ); } else { // New line to html <br> //var_dump( 'before', $message ); //$message = nl2br( $message ); //var_dump( 'after', $message ); } $message = apply_filters( 'bp_better_messages_after_format_message', $message, $message_id, $context, $user_id ); if ( isset( $processedUrls[ $message_id ] ) && !empty( $processedUrls[ $message_id ] ) ) { foreach ( $processedUrls[ $message_id ] as $index => $link ) { $message = str_replace( '%%link_' . ( $index + 1 ) . '%%', $link, $message ); } } return $this->clean_string( $message ); } public function filter_message_content( $content ){ $overwrite = apply_filters('better_messages_filter_message_content_overwrite', '', $content ); if( $overwrite !== '' ) { return $overwrite; } $content = str_replace(['<br/>', '<br />'], '<br>', $content); $allowed_tags = [ 'p', 'b', 'i', 'u', 'strong', 'br', 'strike', 'sub', 'sup', 'span' ]; $content = $this->strip_all_tags( $content, $allowed_tags ); $allowed_tags = [ 'p', 'b', 'i', 'u', 'strong', 'br', 'strike', 'sub', 'sup' ]; if (substr($content, 0, strlen('<p>')) == '<p>') { $content = substr($content, strlen('<p>')); } if (substr($content, 0 - strlen('</p>') ) == '</p>') { $content = substr($content, 0, 0 - strlen('</p>')); } $content = str_replace(array(' style=""', ' style=\"\"'), '', $content); $content = esc_textarea( str_replace('<br>', "\n", $content) ); foreach( $allowed_tags as $tag ){ $content = str_replace("<".$tag.">", "<".$tag.">", $content); $content = str_replace("</".$tag.">", "</".$tag.">", $content); } $content = trim(str_replace(array(" ", '&nbsp;'), " ", $content)); return $content; } function truncate( $text, $length ) { $is_sticker = strpos( $text, '<span class="bpbm-sticker">', 0 ) === 0; $file_icon = strpos( $text, '<i class="fas fa-file">' ); $is_file = $file_icon !== false; $bottom_html = false; if( $is_file ){ $bottom_html = substr($text, $file_icon, strlen( $text ) - $file_icon ); $text = substr($text, 0, $file_icon ); } if( ! $is_sticker && ! $is_file ) { $text = strip_tags($text); } $length = abs( (int) $length ); if(strlen($text) > $length) { $text = preg_replace("/^(.{1,$length})(\s.*|$)/s", '\\1...', $text); } if( $bottom_html !== false ) { if( strlen(trim($text)) > 0 ) { $text .= "<br><br>"; } $text .= $bottom_html; } return($text); } public function get_thread_count( $thread_id, $user_id ) { global $wpdb, $bp; return $wpdb->get_var( $wpdb->prepare( " SELECT unread_count FROM " . bm_get_table('recipients') . " WHERE `thread_id` = %d AND `user_id` = %d ", $thread_id, $user_id ) ); } public function get_name($user_id){ if( $user_id >= 0 ) { $user = get_userdata($user_id); if (is_object($user)) { $name = (!empty($user->fullname)) ? $user->fullname : $user->display_name; } else { $name = __('Deleted User', 'bp-better-messages'); $user_id = 0; } return apply_filters( 'bp_better_messages_display_name', $name, $user_id ); } else { return apply_filters( 'better_messages_guest_display_name', "", $user_id ); } } public function get_rest_avatar($user_id){ $user = Better_Messages()->functions->rest_user_item( $user_id ); if( ! $user || ! $user['avatar'] ){ return Better_Messages()->url . 'assets/images/avatar.png'; } return $user['avatar']; } public function get_avatar($user_id, $size, $args = array()){ if( $size === 0 ) return ''; if( ! Better_Messages()->functions->show_avatars() ) { return Better_Messages()->url . 'assets/images/avatar.png'; } $user = get_userdata($user_id); if ( is_object( $user ) ) { $fullname = (!empty($user->fullname)) ? $user->fullname : $user->display_name; } else { $fullname = __('Deleted User', 'bp-better-messages'); } $_user_id = ( is_object( $user ) ) ? $user->ID : 0; $defaults = array( 'type' => 'full', 'width' => $size, 'height' => $size, 'class' => 'avatar', 'html' => true, 'id' => false, 'alt' => sprintf( __( 'Profile picture of %s', 'bp-better-messages' ), $fullname ) ); $r = wp_parse_args( $args, $defaults ); $r['class'] .= ' bpbm-avatar-user-id-' . $_user_id; extract( $r, EXTR_SKIP ); $email = ( is_object( $user ) ) ? $user->user_email : ''; $extra_attr = apply_filters('bp_better_messages_avatar_extra_attr', ' data-size="' . $size . '" data-user-id="' . $_user_id . '"', $_user_id, $size ); $avatar = apply_filters( 'bp_get_member_avatar', bp_core_fetch_avatar( array( 'item_id' => $_user_id, 'type' => $type, 'alt' => $alt, 'css_id' => $id, 'class' => $class, 'width' => $width, 'height' => $height, 'email' => $email, 'html' => $html, 'extra_attr' => $extra_attr ) ), $r ); if( strpos($avatar, '//', 0) === 0 ){ $avatar = 'https://' . substr( $avatar, 2 ); } return str_replace('src="//', 'src="https://', $avatar); } /** * @param int $thread_id * @param int $user_id * @return bool * * @since 2.0.55 */ public function is_user_participant(int $thread_id, int $user_id ): bool { if( ! $this->is_conversation_exists( $thread_id ) || ! $this->is_user_exists( $user_id ) ){ return false; } global $wpdb; return (bool) $wpdb->get_var($wpdb->prepare(" SELECT COUNT(*) FROM `" . bm_get_table('recipients') . "` WHERE `user_id` = %d AND `thread_id` = %d ", $user_id, $thread_id)); } /** * Add user to specific conversation * * @param int $thread_id * @param int $user_id * @return bool */ public function add_participant_to_thread( int $thread_id, int $user_id ): bool { if( ! $this->is_conversation_exists( $thread_id ) || ! $this->is_user_exists( $user_id ) ){ return false; } global $wpdb; $userIsParticipant = $this->is_user_participant( $thread_id, $user_id ); if( ! $userIsParticipant ) { $return = $wpdb->insert( bm_get_table('recipients'), array( 'user_id' => $user_id, 'thread_id' => $thread_id, 'unread_count' => 0, 'is_deleted' => 0 ) ); if( $return ) { do_action('better_messages_thread_updated', $thread_id); do_action('better_messages_info_changed', $thread_id, [ $user_id ] ); return true; } } return false; } /** * @param int $thread_id * @param int $user_id * @return bool */ public function remove_participant_from_thread(int $thread_id, int $user_id ): bool { if( ! $this->is_conversation_exists( $thread_id ) || ! $this->is_user_exists( $user_id ) ){ return false; } $userIsParticipant = $this->is_user_participant( $thread_id, $user_id ); if( ! $userIsParticipant ) return false; global $wpdb; $result = $wpdb->delete( bm_get_table('recipients'), array( 'user_id' => $user_id, 'thread_id' => $thread_id ), array( '%d', '%d' ) ); if( $result ) { do_action('better_messages_thread_updated', $thread_id); do_action('better_messages_info_changed', $thread_id); do_action('better_messages_participant_removed', $thread_id, $user_id ); return true; } return false; } public function find_existing_threads( $from, $to, $exclude_deleted = null ){ global $wpdb; $query_exclude = "SELECT group_concat(meta_value) as thread_id FROM `{$wpdb->postmeta}` as `postmeta` RIGHT JOIN `{$wpdb->posts}` as `posts` ON `posts`.`ID` = `postmeta`.`post_id` WHERE `posts`.`post_type` = 'bpbm-bulk-report' AND `postmeta`.`meta_key` = 'thread_ids' AND `postmeta`.`meta_value` REGEXP '^[0-9]+$'"; $threads_excluded = $wpdb->get_var($query_exclude); if ($threads_excluded !== null) { $threads_excluded = rtrim($threads_excluded, ','); } if (empty($threads_excluded)) { $threads_excluded = '0'; } if( $exclude_deleted === null ){ $exclude_deleted = Better_Messages()->settings['deletedBehaviour'] !== 'include'; } $exclude_deleted_sql = ''; if( $exclude_deleted ) $exclude_deleted_sql = 'AND recipients.is_deleted = 0'; $threads_between_users = $wpdb->prepare(" SELECT recipients.thread_id FROM " . bm_get_table('recipients') . " as recipients INNER JOIN " . bm_get_table('threads') . " as threads ON recipients.thread_id = threads.id LEFT JOIN " . bm_get_table('threadsmeta') . " threadsmeta ON ( threadsmeta.`bm_thread_id` = threads.`id` AND threadsmeta.meta_key = 'unique_tag' ) WHERE recipients.user_id IN (%d, %d) {$exclude_deleted_sql} AND threads.type = 'thread' AND `threadsmeta`.`meta_value` IS NULL AND threads.id NOT IN (" . $threads_excluded . ") GROUP BY recipients.thread_id HAVING COUNT(recipients.thread_id) = 2", $from, $to); $query = "SELECT thread_id, COUNT(*) as count FROM " . bm_get_table('recipients') . " WHERE " . bm_get_table('recipients') . ".thread_id IN ({$threads_between_users}) GROUP BY thread_id HAVING count = 2"; $threads = $wpdb->get_results($query); $thread_ids = []; if( count($threads) > 0 ){ foreach ( $threads as $thread ){ $thread_ids[] = intval( $thread->thread_id ); } if( ! $exclude_deleted ){ // If deleted included, need to sort not deleted to be first $sql = $wpdb->prepare("SELECT thread_id FROM " . bm_get_table('recipients') . " as recipients WHERE recipients.thread_id IN (" . implode( ',', $thread_ids ) . ") AND user_id = %d ORDER BY is_deleted ASC", $from); $thread_ids = $wpdb->get_col( $sql ); } } return $thread_ids; } /** * @param int $to * @param int|null $from * @param bool $create * @param string $subject * @return array * * @since 2.0.64 */ public function get_private_conversation_id( int $to, ?int $from = null, bool $create = true, string $subject = '', $uniqueKey = null): array{ if( ! Better_Messages()->functions->is_user_authorized() ) { return [ 'result' => 'not_allowed', 'errors' => [ _x('Error while creating new conversation', 'Rest API Error', 'bp-better-messages') ] ]; } if( ! Better_Messages()->functions->is_user_exists( $to ) ) { return [ 'result' => 'not_allowed', 'errors' => [ _x('User does not exists', 'Rest API Error', 'bp-better-messages') ] ]; } if( ! $from ) $from = Better_Messages()->functions->get_current_user_id(); if( ! $uniqueKey ){ $existing_threads = $this->find_existing_threads( $from, $to ); if( count( $existing_threads ) > 0 ){ return [ 'result' => 'thread_found', 'thread_id' => (int) $existing_threads[0] ]; } } $can_start = $this->can_start_conversation( $from, [ $to ], $uniqueKey ); if( $can_start['result'] === 'new_thread' && $create ){ if( ! $uniqueKey ){ $new_thread_id = $this->create_new_conversation( [ $from, $to ], $subject ); } else { $new_thread_id = $this->get_unique_conversation_id( [ $from, $to ], $uniqueKey, $subject ); } if( ! $new_thread_id ){ return [ 'result' => 'not_allowed', 'errors' => [ _x('Error while creating new conversation', 'Rest API Error', 'bp-better-messages') ] ]; } return [ 'result' => 'thread_created', 'thread_id' => (int) $new_thread_id ]; } return $can_start; } /** * @param int $to * @param int|null $from * @param bool $create * @return array */ public function get_pm_thread_id( int $to, ?int $from = null, bool $create = true, string $subject = '' ): array { return $this->get_private_conversation_id( $to, $from, $create, $subject ); } public function get_unique_pm_thread_id( string $uniqueKey, int $to, ?int $from = null, bool $create = true, string $subject = '' ): array { return $this->get_private_conversation_id( $to, $from, $create, $subject, $uniqueKey ); } /** * Create new empty conversation * * @param array $user_ids * @param string $subject * @return int * * @since 2.0.55 */ public function create_new_conversation( array $user_ids, string $subject = '' ){ if( ! is_array( $user_ids ) || count( $user_ids ) === 0 ){ return false; } global $wpdb; if( ! $wpdb->insert( bm_get_table('threads'), [ 'type' => 'thread', 'subject' => trim($subject) ], [ '%s', '%s' ] ) ){ return false; } $new_thread_id = (int) $wpdb->insert_id; $wpdb->query($wpdb->prepare("DELETE FROM " . bm_get_table('threadsmeta') . " WHERE `bm_thread_id` = %d", $new_thread_id)); $wpdb->query($wpdb->prepare("DELETE FROM " . bm_get_table('recipients') . " WHERE `thread_id` = %d", $new_thread_id)); foreach( $user_ids as $user_id ) { $wpdb->insert(bm_get_table('recipients'), [ 'user_id' => $user_id, 'thread_id' => $new_thread_id ], ['%d', '%d'] ); } do_action( 'bp_better_messages_new_thread_created', $new_thread_id, null ); return $new_thread_id; } /** * Get existing or creating new unique conversation based on unique key and user ids * * @param array $user_ids * @param string $unique_key * @param string $subject * @return int * * @since 2.0.67 */ public function get_unique_conversation_id( array $user_ids, string $unique_key, string $subject = '' ){ if( ! is_array( $user_ids ) || count( $user_ids ) === 0 ){ return false; } global $wpdb; $user_ids = array_unique( $user_ids ); $users_tag = '|' . implode( '|', $user_ids) . '|'; $unique_tag = $unique_key . $users_tag; $where = []; $args = [ $unique_key . '|%' ]; foreach( $user_ids as $user_id ){ $where[] = "AND `meta_value` LIKE '%s'"; $args[] = '%|' . intval( $user_id ) . '|%'; } $sql = $wpdb->prepare(" SELECT thread_meta.bm_thread_id FROM " . bm_get_table('threadsmeta') . " thread_meta WHERE `meta_key` = 'unique_tag' AND `meta_value` LIKE %s " . implode(' ', $where) . " LIMIT 0, 1", $args); $exclude_deleted = Better_Messages()->settings['deletedBehaviour'] !== 'include'; if( $exclude_deleted && count($user_ids) === 2 ){ $sql = $wpdb->prepare(" SELECT thread_meta.bm_thread_id, SUM(`recipients`.`is_deleted`) as deleted_count, COUNT(`recipients`.`user_id`) as recipients FROM `" . bm_get_table('threadsmeta') . "` `thread_meta` RIGHT JOIN `" . bm_get_table('recipients') . "` `recipients` ON `thread_meta`.`bm_thread_id` = `recipients`.`thread_id` WHERE `meta_key` = 'unique_tag' AND `meta_value` LIKE %s " . implode(' ', $where) . " GROUP BY `thread_meta`.`bm_thread_id` HAVING deleted_count = 0 AND recipients = 2 LIMIT 0, 1", $args); } $thread_id = (int) $wpdb->get_var( $sql ); if( $thread_id ){ $thread = $this->get_thread( $thread_id ); if( $thread ) { return $thread_id; } } $thread_id = $this->create_new_conversation( $user_ids, $subject ); $this->update_thread_meta( $thread_id, 'unique_tag', $unique_tag ); return $thread_id; } public function get_member_id(){ $user_id = apply_filters('better_messages_get_member_id', null ); if( $user_id ){ return $user_id; } if( function_exists('bp_get_member_user_id') ) { if( ! function_exists('bp_is_user_profile') || ! bp_is_user_profile() ) { $loop_user_id = bp_get_member_user_id(); if ( !! $loop_user_id ) return $loop_user_id; } } $displayed_user_id = bp_displayed_user_id(); if( !! $displayed_user_id ) return $displayed_user_id; if( is_singular() ){ $author_id = get_the_author_meta('ID'); if( !! $author_id ) return $author_id; } return false; } /** * Check if conversation exists * @param int $thread_id * @return bool */ public function is_conversation_exists(int $thread_id ) : bool { $thread = $this->get_thread( $thread_id ); if( $thread ){ return true; } return false; } /** * Check if user exists * @param int $user_id * @return bool */ public function is_user_exists(int $user_id ) : bool { if( $user_id >= 0 ) { $user = get_userdata($user_id); if ($user) { return true; } } else { $guest_exists = Better_Messages()->guests->is_guest_exists( $user_id ); if( $guest_exists ){ return true; } } return false; } public function add_user_to_thread(int $thread_id, int $user_id ) : bool{ return $this->add_participant_to_thread( $thread_id, $user_id ); } public function clean_string( $string ) { //$string = str_replace( PHP_EOL, ' ', $string ); //$string = preg_replace( '/[\r\n]+/', "\n", $string ); //$string = preg_replace( '/[ \t]+/', ' ', $string ); //$string = preg_replace( '<br>', '', $string ); return trim($string); } public function clean_site_url( $url ) { $url = strtolower( $url ); $url = str_replace( '://www.', '://', $url ); $url = str_replace( array( 'http://', 'https://' ), '', $url ); return sanitize_text_field( $url ); } public function hex2rgba($color, $opacity = false) { $default = 'rgb(0,0,0)'; //Return default if no color provided if(empty($color)) return $default; //Sanitize $color if "#" is provided if ($color[0] == '#' ) { $color = substr( $color, 1 ); } //Check if color has 6 or 3 characters and get values if (strlen($color) == 6) { $hex = array( $color[0] . $color[1], $color[2] . $color[3], $color[4] . $color[5] ); } elseif ( strlen( $color ) == 3 ) { $hex = array( $color[0] . $color[0], $color[1] . $color[1], $color[2] . $color[2] ); } else { return $default; } //Convert hexadec to rgb $rgb = array_map('hexdec', $hex); //Check if opacity is set(rgba or rgb) if($opacity){ if(abs($opacity) > 1) $opacity = 1.0; $output = 'rgba('.implode(",",$rgb).','.$opacity.')'; } else { $output = 'rgb('.implode(",",$rgb).')'; } //Return rgb(a) color string return $output; } public function get_undeleted_recipients($thread_id){ $recipients = Better_Messages()->functions->get_recipients( $thread_id ); $undeleted = []; if( count($recipients) > 0 ){ foreach ( $recipients as $recipient ){ if( ! $recipient->is_deleted ){ $undeleted[$recipient->user_id] = $recipient; } } } return $undeleted; } /** * @param int $thread_id * @return string * * @since 2.0.55 */ public function get_conversation_layout(int $thread_id ){ $initialHeight = (int) apply_filters( 'bp_better_messages_max_height', Better_Messages()->settings['messagesHeight'] ); return '<div class="bp-messages-single-thread-wrap" style="height: ' . $initialHeight . 'px" data-thread-id="' . $thread_id . '">' . Better_Messages()->functions->container_placeholder() . '</div>'; } public function get_page( $args = [] ){ if (defined('WP_DEBUG') && true === WP_DEBUG) { // some debug to add later } else { error_reporting(0); } if( ! is_array( $args ) ) $args = []; $args = wp_parse_args( $args, [ 'full_screen' => false ] ); $initialHeight = (int) apply_filters( 'bp_better_messages_max_height', Better_Messages()->settings['messagesHeight'] ); $full_screen = $args['full_screen'] ? '1' : '0'; ob_start(); echo '<div class="bp-messages-wrap-main" style="height: ' . $initialHeight . 'px" data-full-screen="' . $full_screen . '">' . Better_Messages()->functions->container_placeholder() . '</div>'; return ob_get_clean(); } public function get_group_page( $group_id ){ if (defined('WP_DEBUG') && true === WP_DEBUG) { // some debug to add later } else { error_reporting(0); } $thread_id = Better_Messages()->groups->get_group_thread_id( $group_id ); ob_start(); $is_in_groups_now = bm_bp_is_current_component('groups'); $initialHeight = (int) apply_filters( 'bp_better_messages_max_height', Better_Messages()->settings['messagesHeight'] ); ?> <div style="height:<?php echo $initialHeight; ?>px" class="bp-messages-wrap-group <?php if( $is_in_groups_now ) { echo 'bp-messages-group-thread'; }; ?> <?php Better_Messages()->functions->messages_classes($thread_id, 'group'); ?>" data-thread-id="<?php esc_attr_e($thread_id); ?>"><?php echo Better_Messages()->functions->container_placeholder(); ?></div> <?php $content = ob_get_clean(); return Better_Messages()->functions->minify_html( $content ); } public function get_threads_html( $user_id = null, $height = 400 ){ return $this->get_conversations_layout( $height ); } public function get_conversations_layout( $height = 400 ){ ob_start(); echo '<div class="bp-messages-wrap bm-threads-list" style="height:' . $height . 'px"></div>'; return ob_get_clean(); } public function get_thread_meta( $thread_id, $key = '' ) { $retval = get_metadata( 'bm_thread', $thread_id, $key, true ); return $retval; } public function update_thread_meta( $thread_id, $meta_key, $meta_value ) { $retval = update_metadata( 'bm_thread', $thread_id, $meta_key, $meta_value ); return $retval; } public function delete_thread_meta( $thread_id, $meta_key ) { $retval = delete_metadata( 'bm_thread', $thread_id, $meta_key); return $retval; } public function add_message_meta( $message_id, $meta_key, $meta_value, $unique = true ) { $retval = add_metadata( 'bm_message', $message_id, $meta_key, $meta_value, $unique ); return $retval; } public function get_message_meta( $message_id, $key = '', $single = true ) { $retval = get_metadata( 'bm_message', $message_id, $key, $single ); return $retval; } public function update_message_meta( $message_id, $meta_key, $meta_value ) { $retval = update_metadata( 'bm_message', $message_id, $meta_key, $meta_value ); return $retval; } public function delete_message_meta( $message_id, $meta_key, $meta_value = null ) { $retval = delete_metadata( 'bm_message', $message_id, $meta_key, $meta_value ); return $retval; } public function get_user_muted_threads( $user_id ){ if( Better_Messages()->settings['allowMuteThreads'] !== '1' ) { return []; } $muted_threads = []; global $wpdb; $sql = $wpdb->prepare("SELECT thread_id FROM `" . bm_get_table('recipients') . "` WHERE `is_muted` = 1 AND `user_id` = %d", $user_id); $results = $wpdb->get_col( $sql ); if( is_array( $results ) && count( $results ) > 0 ) { foreach ( $results as $thread_id ){ $muted_threads[ (int) $thread_id ] = (int) $thread_id; } } return $muted_threads; } /** * @param int $thread_id * @return BM_Thread | false */ public function get_thread(int $thread_id ){ global $wpdb; $thread = wp_cache_get( 'thread_' . $thread_id, 'bm_messages' ); if( $thread ){ return $thread; } $thread = $wpdb->get_row( $wpdb->prepare("SELECT * FROM " . bm_get_table('threads') . " WHERE id = %d", $thread_id ) ); if( ! $thread ) { $thread = false; } wp_cache_set('thread_' . $thread_id, $thread, 'bm_messages'); return $thread; } /** * @param int $thread_id * @return string */ public function get_thread_type( int $thread_id ): string { $thread_type = wp_cache_get( 'thread_' . $thread_id . '_type', 'bm_messages' ); if( $thread_type ){ return $thread_type; } $thread = $this->get_thread( $thread_id ); $thread_type = 'thread'; if( $thread->type === 'group' ) { $is_valid_group = apply_filters( 'better_messages_is_valid_group', false, $thread_id ); if( $is_valid_group ){ $thread_type = 'group'; } } else { $chat_id = Better_Messages()->functions->get_thread_meta($thread_id, 'chat_id'); if ( ! empty( $chat_id ) && get_post_type( $chat_id ) === 'bpbm-chat' ) { $thread_type = 'chat-room'; } } $thread_type = apply_filters( 'better_messages_get_thread_type', $thread_type, $thread_id ); wp_cache_set('thread_' . $thread_id . '_type', $thread_type, 'bm_messages'); return $thread_type; } public function get_thread_title( int $thread_id ){ $thread = $this->get_thread( $thread_id ); if( ! $thread ) return ""; $title = html_entity_decode( $thread->subject ); if( Better_Messages()->settings['disableSubject'] === '1' && empty( $thread->subject ) ){ $thread_type = $this->get_thread_type( $thread_id ); if( $thread_type === 'thread' ){ $recipients = Better_Messages()->functions->get_recipients( $thread_id ); $title = sprintf(_x('%s Participants', 'Thread Title (when subjects are disabled)', 'bp-better-messages'), count( $recipients) ); } } return apply_filters('better_messages_thread_title', $title, $thread_id, $thread ); } public function get_thread_image( $thread_id ){ $image = ""; $thread = $this->get_thread( $thread_id ); if( ! $thread ) return $image; return apply_filters('better_messages_thread_image', $image, $thread_id, $thread ); } public function get_thread_url( $thread_id ){ $url = ""; $thread = $this->get_thread( $thread_id ); if( ! $thread ) return $url; return apply_filters('better_messages_thread_url', $url, $thread_id, $thread ); } public function is_friends_active(){ return apply_filters( 'better_messages_friends_active', false ); } public function is_only_friends_mode(){ if( ! $this->is_friends_active() ) return false; return apply_filters( 'better_messages_only_friends_mode', false ); } public function is_friends( $user_id_1, $user_id_2 ){ if( ! $this->is_friends_active() ) return false; if( function_exists('friends_check_friendship') ){ return friends_check_friendship( $user_id_1, $user_id_2 ); } return apply_filters( 'better_messages_is_friends', false, $user_id_1, $user_id_2 ); } public function is_followers_active(){ return apply_filters( 'better_messages_followers_active', false ); } public function is_only_followers_mode(){ if( ! $this->is_followers_active() ) return false; return apply_filters( 'better_messages_only_followers_mode', false ); } public function is_groups_active(){ return apply_filters( 'better_messages_groups_active', false ); } public function is_followers( $user_id_1, $user_id_2 ){ return apply_filters( 'better_messages_is_followers', false, $user_id_1, $user_id_2 ); } public function is_verified( $user_id ){ return apply_filters( 'better_messages_is_verified', false, $user_id ); } public function video_calls_active(){ return Better_Messages()->settings['videoCalls'] === '1'; } public function audio_calls_active(){ return Better_Messages()->settings['audioCalls'] === '1'; } public function is_calls_only_friends(){ return $this->is_friends_active() && Better_Messages()->settings['callsLimitFriends'] === '1'; } public function rest_user_item( $user_id, $include_personal = true ){ $url = false; if( count_user_posts($user_id) > 0 ) { $url = get_author_posts_url($user_id); } $item = [ 'id' => (string) $user_id, 'user_id' => (int) $user_id, 'name' => html_entity_decode( Better_Messages()->functions->get_name( $user_id ) ), 'avatar' => Better_Messages()->functions->get_avatar( $user_id, 50, ['html' => false] ), 'url' => $url, 'verified' => (int) $this->is_verified( $user_id ), 'lastActive' => Better_Messages()->functions->get_last_activity( $user_id ) ]; $statuses_enabled = Better_Messages()->settings['userStatuses'] === '1'; if( $statuses_enabled ) { $status = Better_Messages()->websocket->get_user_status($user_id); $statuses = Better_Messages()->websocket->get_all_statuses(); $item['status'] = [ 'slug' => $status, 'icon' => $statuses[$status]['icon'], 'label' => Better_Messages()->websocket->get_status_display_name($status) ]; } if( $include_personal ){ $item['isFriend'] = (int) $this->is_friends( Better_Messages()->functions->get_current_user_id(), $user_id ); if( ! $this->is_calls_only_friends() ) { $item['canVideo'] = (int) $this->video_calls_active(); $item['canAudio'] = (int) $this->audio_calls_active(); } else { $item['canVideo'] = (int) $this->video_calls_active() && $item['isFriend']; $item['canAudio'] = (int) $this->audio_calls_active() && $item['isFriend']; } } return apply_filters( 'better_messages_rest_user_item', $item, $user_id, $include_personal ); } public function get_message_by_order( $thread_id, $message_number = 1 ){ global $wpdb; $offset = $message_number - 1; if( $offset < 0 ) $offset = 0; $message_id = (int) $wpdb->get_var($wpdb->prepare("SELECT id FROM `" . bm_get_table('messages') . "` WHERE `thread_id` = %d ORDER BY `created_at` DESC LIMIT %d, 1", $thread_id, $offset)); return $message_id; } public function get_friends_sorted( $user_id, $count = 'all' ){ global $wpdb; $friends = apply_filters( 'better_messages_get_friends', [], $user_id ); if( count( $friends ) === 0 ) { return []; } if( empty ( $friends ) ) return []; $last_active_users = []; foreach ( $friends as $friend ){ $last_active_users[ $friend['id'] ] = 0; } $query = "SELECT `ID`, `last_activity` FROM `" . bm_get_table('users') . "` users_index WHERE `ID` IN (" . implode( ',', array_keys( $last_active_users ) ) . ") ORDER BY `last_activity` DESC"; if( $count !== 'all' ) { $query .= $wpdb->prepare(' LIMIT 0, %d', $count ); } $last_activity = $wpdb->get_results( $query ); if ( ! empty ( $last_activity ) ) { foreach ($last_activity as $item) { $last_active_users[$item->ID] = strtotime( $item->last_activity ); } } arsort($last_active_users); if( $count !== 'all' ) { $last_active_users = array_slice( $last_active_users, 0, $count, true ); } return $last_active_users; } public function get_users_sorted( $user_id, $exclude = [], $count = 10 ){ if( $count === 0 ){ return []; } global $wpdb; $last_active_users = []; $excluded = []; $excluded_sql = ''; if( count( $exclude ) > 0 ) { foreach ($exclude as $item) { $excluded[] = (int) $item; } $excluded_sql = "AND `ID` NOT IN (" . implode( ',', $excluded ) . ")"; } $initial_sql = []; if( ! Better_Messages()->guests->guest_access_enabled() ){ $initial_sql[] = "AND `ID` NOT IN(SELECT DISTINCT(user_id) FROM `" . bm_get_table('roles') . "` WHERE `role` = 'bm-guest' )"; } $additional_sql_condition = apply_filters('better_messages_search_user_sql_condition', $initial_sql, array_map('intval', $excluded ), '', $user_id ); $query = $wpdb->prepare(" SELECT `ID`, `last_activity` FROM `" . bm_get_table('users') . "` WHERE `ID` != %d " . $excluded_sql . " " . implode(' ', $additional_sql_condition ) . " ORDER BY `last_activity` DESC", $user_id); $query .= $wpdb->prepare(' LIMIT 0, %d', $count ); $last_activity = $wpdb->get_results( $query ); if ( ! empty ( $last_activity ) ) { foreach ($last_activity as $item) { $last_active_users[$item->ID] = strtotime( $item->last_activity ); } } arsort($last_active_users); return $last_active_users; } public function check_this_is_multsite() { global $wpmu_version; if (function_exists('is_multisite')){ if (is_multisite()) { return true; } if (!empty($wpmu_version)){ return true; } } return false; } public function is_ajax(){ if( ! empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest' ) { return true; } return false; } public function minify_js($input) { if(trim($input) === "") return $input; return preg_replace( array( // Remove comment(s) '#\s*("(?:[^"\\\]++|\\\.)*+"|\'(?:[^\'\\\\]++|\\\.)*+\')\s*|\s*\/\*(?!\!|@cc_on)(?>[\s\S]*?\*\/)\s*|\s*(?<![\:\=])\/\/.*(?=[\n\r]|$)|^\s*|\s*$#', // Remove white-space(s) outside the string and regex '#("(?:[^"\\\]++|\\\.)*+"|\'(?:[^\'\\\\]++|\\\.)*+\'|\/\*(?>.*?\*\/)|\/(?!\/)[^\n\r]*?\/(?=[\s.,;]|[gimuy]|$))|\s*([!%&*\(\)\-=+\[\]\{\}|;:,.<>?\/])\s*#s', // Remove the last semicolon '#;+\}#', // Minify object attribute(s) except JSON attribute(s). From `{'foo':'bar'}` to `{foo:'bar'}` '#([\{,])([\'])(\d+|[a-z_][a-z0-9_]*)\2(?=\:)#i', // --ibid. From `foo['bar']` to `foo.bar` '#([a-z0-9_\)\]])\[([\'"])([a-z_][a-z0-9_]*)\2\]#i' ), array( '$1', '$1$2', '}', '$1$3', '$1.$3' ), $input); } public function minify_css($input) { if(trim($input) === "") return $input; return preg_replace( array( // Remove comment(s) '#("(?:[^"\\\]++|\\\.)*+"|\'(?:[^\'\\\\]++|\\\.)*+\')|\/\*(?!\!)(?>.*?\*\/)|^\s*|\s*$#s', // Remove unused white-space(s) '#("(?:[^"\\\]++|\\\.)*+"|\'(?:[^\'\\\\]++|\\\.)*+\'|\/\*(?>.*?\*\/))|\s*+;\s*+(})\s*+|\s*+([*$~^|]?+=|[{};,>~]|\s(?![0-9\.])|!important\b)\s*+|([[(:])\s++|\s++([])])|\s++(:)\s*+(?!(?>[^{}"\']++|"(?:[^"\\\]++|\\\.)*+"|\'(?:[^\'\\\\]++|\\\.)*+\')*+{)|^\s++|\s++\z|(\s)\s+#si', // Replace `0(cm|em|ex|in|mm|pc|pt|px|vh|vw|%)` with `0` '#(?<=[\s:])(0)(cm|em|ex|in|mm|pc|pt|px|vh|vw|%)#si', // Replace `:0 0 0 0` with `:0` '#:(0\s+0|0\s+0\s+0\s+0)(?=[;\}]|\!important)#i', // Replace `background-position:0` with `background-position:0 0` '#(background-position):0(?=[;\}])#si', // Replace `0.6` with `.6`, but only when preceded by `:`, `,`, `-` or a white-space '#(?<=[\s:,\-])0+\.(\d+)#s', // Minify string value '#(\/\*(?>.*?\*\/))|(?<!content\:)([\'"])([a-z_][a-z0-9\-_]*?)\2(?=[\s\{\}\];,])#si', '#(\/\*(?>.*?\*\/))|(\burl\()([\'"])([^\s]+?)\3(\))#si', // Minify HEX color code '#(?<=[\s:,\-]\#)([a-f0-6]+)\1([a-f0-6]+)\2([a-f0-6]+)\3#i', // Replace `(border|outline):none` with `(border|outline):0` '#(?<=[\{;])(border|outline):none(?=[;\}\!])#', // Remove empty selector(s) '#(\/\*(?>.*?\*\/))|(^|[\{\}])(?:[^\s\{\}]+)\{\}#s' ), array( '$1', '$1$2$3$4$5$6$7', '$1', ':0', '$1:0 0', '.$1', '$1$3', '$1$2$4$5', '$1$2$3', '$1:0', '$1$2' ), $input); } public function minify_html($input) { if(trim($input) === "") return $input; return $input; // Remove extra white-space(s) between HTML attribute(s) $input = preg_replace_callback('#<([^\/\s<>!]+)(?:\s+([^<>]*?)\s*|\s*)(\/?)>#s', function($matches) { return '<' . $matches[1] . preg_replace('#([^\s=]+)(\=([\'"]?)(.*?)\3)?(\s+|$)#s', ' $1$2', $matches[2]) . $matches[3] . '>'; }, str_replace("\r", "", $input)); // Minify inline CSS declaration(s) if(strpos($input, ' style=') !== false) { $input = preg_replace_callback('#<([^<]+?)\s+style=([\'"])(.*?)\2(?=[\/\s>])#s', function($matches) { return '<' . $matches[1] . ' style=' . $matches[2] . $this->minify_css($matches[3]) . $matches[2]; }, $input); } if(strpos($input, '</style>') !== false) { $input = preg_replace_callback('#<style(.*?)>(.*?)</style>#is', function($matches) { return '<style' . $matches[1] .'>'. $this->minify_css($matches[2]) . '</style>'; }, $input); } if(strpos($input, '</script>') !== false) { $input = preg_replace_callback('#<script(.*?)>(.*?)</script>#is', function($matches) { return '<script' . $matches[1] .'>'. $this->minify_js($matches[2]) . '</script>'; }, $input); } return preg_replace( array( // t = text // o = tag open // c = tag close // Keep important white-space(s) after self-closing HTML tag(s) '#<(img|input)(>| .*?>)#s', // Remove a line break and two or more white-space(s) between tag(s) '#(<!--.*?-->)|(>)(?:\n*|\s{2,})(<)|^\s*|\s*$#s', '#(<!--.*?-->)|(?<!\>)\s+(<\/.*?>)|(<[^\/]*?>)\s+(?!\<)#s', // t+c || o+t '#(<!--.*?-->)|(<[^\/]*?>)\s+(<[^\/]*?>)|(<\/.*?>)\s+(<\/.*?>)#s', // o+o || c+c '#(<!--.*?-->)|(<\/.*?>)\s+(\s)(?!\<)|(?<!\>)\s+(\s)(<[^\/]*?\/?>)|(<[^\/]*?\/?>)\s+(\s)(?!\<)#s', // c+t || t+o || o+t -- separated by long white-space(s) '#(<!--.*?-->)|(<[^\/]*?>)\s+(<\/.*?>)#s', // empty tag '#<(img|input)(>| .*?>)<\/\1>#s', // reset previous fix '#( ) (?![<\s])#', // clean up ... '#(?<=\>)( )(?=\<)#', // --ibid // Remove HTML comment(s) except IE comment(s) '#\s*<!--(?!\[if\s).*?-->\s*|(?<!\>)\n+(?=\<[^!])#s' ), array( '<$1$2</$1>', '$1$2$3', '$1$2$3', '$1$2$3$4$5', '$1$2$3$4$5$6$7', '$1$2$3', '<$1$2', '$1 ', '$1', "" ), $input); } public function license_proposal( $return = false ){ ob_start(); if( ! Better_Messages()->functions->can_use_premium_code() ) { echo '<a style="font-size: 10px;" href="' . admin_url('admin.php?page=bp-better-messages-pricing') . '">' . __('Get WebSocket License', 'bp-better-messages') . '</a>'; } else { if( ! bpbm_fs()->is_premium() ){ $url = bpbm_fs()->_get_latest_download_local_url(); $string = sprintf(__('<a href="%s" target="_blank">Download</a> and install Premium version of plugin to use this feature', 'bp-better-messages'), $url); echo '<span style="display: block;margin: 10px 0;max-width: 200px;padding: 10px;color: #721c24;background-color: #f8d7da;border: 1px solid #f5c6cb;">' . $string . '</span>'; } } $html = ob_get_clean(); if( $return ) { return $html; } else { echo $html; } } public function show_avatars(){ return ! empty( get_option('show_avatars') ); } function strip_all_tags( $string, $allowed_tags = [], $remove_breaks = false ) { $string = preg_replace( '@<(script|style)[^>]*?>.*?</\\1>@si', '', $string ); $string = strip_tags( $string, $allowed_tags ); if ( $remove_breaks ) { $string = preg_replace( '/[\r\n\t ]+/', ' ', $string ); } return trim( $string ); } public function messages_classes( $thread_id = false, $type = 'thread' ){ global $bpbmCurrentClass; $classes = []; if( $type === 'chat-room' ){ $chat_id = Better_Messages()->functions->get_thread_meta( $thread_id, 'chat_id' ); $chat_settings = Better_Messages()->chats->get_chat_settings( $chat_id ); if( $chat_settings['template'] === 'default' ){ $class = 'bpbm-template-' . Better_Messages()->settings['template']; } else { $class = 'bpbm-template-' . $chat_settings['template']; } if( $class === 'bpbm-template-modern' ) { if( $chat_settings['modernLayout'] === 'default' ) { $classes[] = $class . '-' . Better_Messages()->settings['modernLayout']; } else { $classes[] = $class . '-' . $chat_settings['modernLayout']; } } } else { $class = 'bpbm-template-' . Better_Messages()->settings['template']; if (Better_Messages()->settings['template'] === 'modern') { $classes[] = $class . '-' . Better_Messages()->settings['modernLayout']; } } $classes[] = $class; if( ! is_user_logged_in() ) { $classes[] = 'bpbm-not-logged-in'; } $bpbmCurrentClass = implode(' ', $classes); echo $bpbmCurrentClass; } public function remove_re( $str ){ $prefix = 're:'; $str = trim($str); while( substr(strtolower($str), 0, strlen($prefix)) == $prefix ) { $str = trim(substr($str, strlen($prefix))); } return trim($str); } public function clean_no_subject( $subject ){ if( defined('BP_PLATFORM_VERSION') ){ $text = __( 'No Subject', 'buddyboss' ); } else { $text = __( 'No Subject', 'buddypress' ); } if( trim( $subject ) === $text ){ return ''; } else { return $subject; } } /* * Inserts a new key/value before the key in the array. * * @param $key * The key to insert before. * @param $array * An array to insert in to. * @param $new_key * The key to insert. * @param $new_value * An value to insert. * * @return * The new array if the key exists, FALSE otherwise. * * @see array_insert_after() */ function array_insert_before($key, array &$array, $new_key, $new_value) { if (array_key_exists($key, $array)) { $new = array(); foreach ($array as $k => $value) { if ($k === $key) { $new[$new_key] = $new_value; } $new[$k] = $value; } return $new; } return FALSE; } /* * Inserts a new key/value after the key in the array. * * @param $key * The key to insert after. * @param $array * An array to insert in to. * @param $new_key * The key to insert. * @param $new_value * An value to insert. * * @return * The new array if the key exists, FALSE otherwise. * * @see array_insert_before() */ function array_insert_after($key, array &$array, $new_key, $new_value) { if (array_key_exists ($key, $array)) { $new = array(); foreach ($array as $k => $value) { $new[$k] = $value; if ($k === $key) { $new[$new_key] = $new_value; } } return $new; } return FALSE; } public function messages_mark_thread_read( $thread_id, $user_id = false ){ global $wpdb; if( $user_id === false ) { $user_id = Better_Messages()->functions->get_current_user_id(); } $current_unread = (int) $wpdb->get_var( $wpdb->prepare("SELECT unread_count FROM " . bm_get_table('recipients') . " WHERE user_id = %d AND thread_id = %d", $user_id, $thread_id) ); $mysql_time = bp_core_current_time(); if( $current_unread > 0 ){ $time = Better_Messages()->functions->get_microtime(); $wpdb->query( $wpdb->prepare( "UPDATE " . bm_get_table('recipients'). " SET unread_count = 0, last_update = %d, last_read = %s, last_delivered = %s WHERE user_id = %d AND thread_id = %d", $time, $mysql_time, $mysql_time, $user_id, $thread_id ) ); } else { $wpdb->query( $wpdb->prepare( "UPDATE " . bm_get_table('recipients'). " SET last_read = %s, last_delivered = %s WHERE user_id = %d AND thread_id = %d", $mysql_time, $mysql_time, $user_id, $thread_id ) ); } wp_cache_delete( 'thread_recipients_' . $thread_id, 'bp_messages' ); wp_cache_delete( 'bm_thread_recipients_' . $thread_id, 'bp_messages' ); wp_cache_delete( $user_id, 'bp_messages_unread_count' ); $this->clean_thread_notifications( $thread_id, $user_id ); do_action('better_messages_mark_thread_read', $thread_id, $user_id ); return true; } function sanitize_xss($value) { return htmlspecialchars(strip_tags($value)); } public function clean_thread_notifications($thread_id, $user_id){ if ( ! function_exists('bp_notifications_add_notification') ) { return false; } Better_Messages_Notifications()->mark_notification_as_read( $thread_id, $user_id ); } public function can_use_premium_code_premium_only(){ if( $this->is_network_subsite_and_has_license() ) { return true; } return bpbm_fs()->can_use_premium_code__premium_only(); } public function can_use_premium_code(){ if( $this->is_network_subsite_and_has_license() ) { return true; } return bpbm_fs()->can_use_premium_code(); } public function is_network_subsite_and_has_license(){ if( defined('MULTISITE') && defined('SUBDOMAIN_INSTALL') && MULTISITE === true && SUBDOMAIN_INSTALL === false ) { if( $this->multisite_resolved !== null ){ return $this->multisite_resolved; } if( is_plugin_active_for_network(basename(Better_Messages()->path) . '/bp-better-messages.php') ) { $network = get_network(); $main_site_id = (int)$network->site_id; $main_blog_id = (int)$network->blog_id; if (get_current_blog_id() !== $main_blog_id) { $fs_blog = get_blog_option($main_blog_id, 'fs_accounts', false); if (isset($fs_blog['sites']['bp-better-messages'])) { $site = $fs_blog['sites']['bp-better-messages']; if (isset($site->license_id)) { $license_id = $site->license_id; $fs_network = get_network_option($main_site_id, 'fs_accounts', false); if (isset($fs_network['all_licenses']['1557']) && is_array($fs_network['all_licenses']['1557'])) { foreach ($fs_network['all_licenses']['1557'] as $_license) { if ( (int)$license_id === (int)$_license->id ) { define('BP_BETTER_MESSAGES_FORCE_LICENSE_KEY', $_license->secret_key); define('BP_BETTER_MESSAGES_FORCE_DOMAIN', $site->url); $this->multisite_resolved = true; return true; } } } } } } } $this->multisite_resolved = false; return false; } return false; } public function render_login_form(){ ob_start(); ?> <style type="text/css"> .bm-login-form{ background: white; border: 1px solid #ccc; color: black; padding: 15px 25px; margin: 15px auto; width: 100%; max-width: 600px; } .bm-login-form .bm-login-text{ color: black; font-size: 16px; margin: 10px 0 20px; font-weight: bold; } .bm-login-form form label{ display: block; width: 100%; margin-bottom: 10px; } .bm-login-form form input[type="text"], .bm-login-form form input[type="password"]{ display: block; width: 100%; } </style> <div class="bm-login-form"> <?php echo '<p class="bm-login-text">' . _x('Login required', 'Login form for unlogged users', 'bp-better-messages') . '</p>'; wp_login_form([ 'form_id' => 'bm-login-form', 'redirect' => add_query_arg([]) ]); ?> </div> <?php return ob_get_clean(); } public function pm_link( $user_id = false ) { if( ! $user_id ) { $user_id = Better_Messages()->functions->get_member_id(); } if( Better_Messages()->settings['fastStart'] == '1' ){ return add_query_arg([ 'bm-fast-start' => '1', 'to' => $user_id ], Better_Messages()->functions->get_link( Better_Messages()->functions->get_current_user_id() )); } else { return Better_Messages()->functions->add_hash_arg('new-conversation', [ 'to' => $user_id ], Better_Messages()->functions->get_link( Better_Messages()->functions->get_current_user_id() )); } } public function pre_template_include(){ remove_filter( 'the_content', 'convert_smilies', 20 ); } public function after_template_include(){ #add_filter( 'the_content', 'convert_smilies', 20 ); } public function archive_thread( $user_id, $thread_id ){ global $wpdb; /** * Fires before a message thread is marked as deleted. * * @since 2.2.0 * @since 2.7.0 The $user_id parameter was added. * * @param int $thread_id ID of the thread being deleted. * @param int $user_id ID of the user that the thread is being deleted for. */ do_action( 'bp_messages_thread_before_mark_delete', $thread_id, $user_id ); $time = Better_Messages()->functions->get_microtime(); // Mark messages as deleted $wpdb->query( $wpdb->prepare( "UPDATE " . bm_get_table('recipients') . " SET is_deleted = 1, last_update = %d WHERE thread_id = %d AND user_id = %d", $time, $thread_id, $user_id ) ); do_action( 'better_messages_thread_updated', $thread_id ); } public function new_message( $args = '' ) { if( is_array($args) && ! is_user_logged_in() ) { if ( ! isset($args['sender_id']) || $args['sender_id'] === 0 ) { $args['sender_id'] = Better_Messages()->functions->get_current_user_id(); } } $microtime = Better_Messages()->functions->get_microtime(); // Parse the default arguments. $r = bp_parse_args( $args, array( 'sender_id' => Better_Messages()->functions->get_current_user_id(), 'thread_id' => false, // False for a new message, thread id for a reply to a thread. 'recipients' => array(), // Can be an array of usernames, user_ids or mixed. 'subject' => false, 'content' => false, 'send_push' => true, 'mobile_push' => true, 'count_unread' => true, // If false - no sound notification will be also played 'show_on_site' => true, 'meta' => false, 'notification' => false, 'send_global' => true, 'bulk_hide' => false, 'is_pending' => 0, 'date_sent' => bp_core_current_time(), 'created_at' => $microtime, 'updated_at' => $microtime, 'meta_data' => [], 'attachments' => [], 'temp_id' => '', 'return' => 'thread_id', 'error_type' => 'bool', 'is_update' => false, 'ai_moderation_result' => null, 'ai_moderation_deferred' => false ), 'bm_new_message' ); // Bail if no sender or no content. if ( empty( $r['sender_id'] ) || empty( $r['content'] ) ) { if ( 'wp_error' === $r['error_type'] ) { if ( empty( $r['sender_id'] ) ) { $error_code = 'messages_empty_sender'; $feedback = __( 'Your message was not sent. Please use a valid sender.', 'bp-better-messages' ); } else { $error_code = 'messages_empty_content'; $feedback = __( 'Your message was not sent. Please enter some content.', 'bp-better-messages' ); } return new WP_Error( $error_code, $feedback ); } else { return false; } } // Create a new message object. $message = new BM_Messages_Message; $message->thread_id = $r['thread_id']; $message->sender_id = $r['sender_id']; $message->subject = $r['subject']; $message->message = $r['content']; $message->date_sent = $r['date_sent']; $message->created_at = $r['created_at']; $message->updated_at = $r['updated_at']; $message->temp_id = $r['temp_id']; $message->is_pending = $r['is_pending']; $message->bulk_hide = $r['bulk_hide']; $message->send_global = $r['send_global']; $message->count_unread = (bool) $r['count_unread']; $message->show_on_site = (bool) $r['show_on_site']; $message->send_push = $r['send_push']; $message->mobile_push = $r['mobile_push']; $message->meta = $r['meta']; $message->notification = $r['notification']; $message->is_update = $r['is_update']; $message->ai_moderation_result = $r['ai_moderation_result']; $message->ai_moderation_deferred = $r['ai_moderation_deferred']; $is_pending = $message->is_pending; $new_thread = false; // If we have a thread ID... if ( ! empty( $r['thread_id'] ) ) { $message->recipients = Better_Messages()->functions->get_recipients( $r['thread_id'] ); // Strip the sender from the recipient list, and unset them if they are // not alone. If they are alone, let them talk to themselves. if ( isset( $message->recipients[ $r['sender_id'] ] ) && ( count( $message->recipients ) > 1 ) ) { unset( $message->recipients[ $r['sender_id'] ] ); } // Set a default reply subject if none was sent. if ( empty( $message->subject ) && isset( $thread->messages[0] ) ) { $message->subject = sprintf( __( 'Re: %s', 'bp-better-messages' ), $thread->messages[0]->subject ); } // ...otherwise use the recipients passed } else { if ( empty( $r['recipients'] ) ) { if ( 'wp_error' === $r['error_type'] ) { return new WP_Error( 'message_empty_recipients', _x( 'Please select recipient(s) before sending the message', 'User tried to send message with no recipients', 'bp-better-messages' )); } else { return false; } } if( ! is_array( $r['recipients'] ) ){ $r['recipients'] = [$r['recipients']]; } // Remove duplicates & bail if no recipients. $recipient_ids = array_map( 'intval', array_unique( $r['recipients'] ) ); // Format this to match existing recipients. if( ! $message->recipients ) $message->recipients = []; foreach ( (array) $recipient_ids as $i => $recipient_id ) { $message->recipients[ $i ] = new stdClass; $message->recipients[ $i ]->user_id = $recipient_id; } $new_thread = true; } if( ! $new_thread ){ $type = Better_Messages()->functions->get_thread_type( $message->thread_id ); if( $type === 'chat-room' ) { $chat_id = Better_Messages()->functions->get_thread_meta($message->thread_id, 'chat_id'); if ( ! empty($chat_id) ) { $excluded_from_thread_list = Better_Messages()->functions->get_thread_meta($message->thread_id, 'exclude_from_threads_list'); if (!empty($excluded_from_thread_list)) { $message->count_unread = false; $message->send_global = false; } else { $notifications_enabled = Better_Messages()->functions->get_thread_meta($message->thread_id, 'enable_notifications'); if ($notifications_enabled !== '1') { $message->send_push = false; $message->mobile_push = false; } } } } if( $type === 'group' ) { if ( Better_Messages()->settings['enableGroupsPushs'] !== '1' ) { $group_id = Better_Messages()->functions->get_thread_meta($message->thread_id, 'group_id'); if ( ! empty( $group_id ) ) { $message->send_push = false; $message->mobile_push = false; } } if ( Better_Messages()->settings['PSenableGroupsPushs'] !== '1' ) { $group_id = Better_Messages()->functions->get_thread_meta($message->thread_id, 'peepso_group_id'); if ( ! empty( $group_id ) ) { $message->send_push = false; $message->mobile_push = false; } } if ( Better_Messages()->settings['UMenableGroupsPushs'] !== '1' ) { $group_id = Better_Messages()->functions->get_thread_meta($message->thread_id, 'um_group_id'); if ( ! empty( $group_id ) ) { $message->send_push = false; $message->mobile_push = false; } } if( Better_Messages()->settings['FCenableGroupsPushs'] !== '1' ){ $group_id = Better_Messages()->functions->get_thread_meta($message->thread_id, 'fluentcommunity_group_id'); if ( ! empty( $group_id ) ) { $message->send_push = false; $message->mobile_push = false; } } } } /*if( $is_pending !== 0 ){ $message->count_unread = false; $message->send_global = false; $message->send_push = false; $message->mobile_push = false; }*/ $message->new_thread = (bool) $new_thread; // Bail if message failed to send. $send = $message->send(); if ( false === is_int( $send ) ) { if ( 'wp_error' === $r['error_type'] ) { if ( is_wp_error( $send ) ) { return $send; } else { return new WP_Error( 'message_generic_error', __( 'Message was not sent. Please try again.', 'bp-better-messages' ) ); } } return false; } if( $new_thread ){ Better_Messages()->functions->delete_all_thread_meta( $message->thread_id ); Better_Messages()->functions->update_thread_meta( $message->thread_id, 'thread_starter_user_id', $r['sender_id'] ); Better_Messages()->functions->update_thread_meta( $message->thread_id, 'thread_start_time', time() ); } $this->delete_all_message_meta( $message->id ); if( isset($args['meta_data']) && is_array( $args['meta_data'] ) && count( $args['meta_data'] ) > 0 ){ foreach( $args['meta_data'] as $key => $value ){ if( is_array( $value ) ){ $value = array_map( function( $v ){ return is_numeric( $v ) ? $v : sanitize_text_field( $v ); }, $value ); } else { $value = sanitize_text_field( $value ); } Better_Messages()->functions->update_message_meta( $message->id, sanitize_text_field($key), $value ); } } if( isset( $args['attachments'] ) && is_array( $args['attachments'] ) && count( $args['attachments'] ) > 0 ){ $attachment_meta = []; $enable_double_check = apply_filters('better_messages_ensure_file_is_not_from_other_gallery', true ); foreach( $args['attachments'] as $attachment_id ){ if( $enable_double_check ) { if ( empty( get_post_meta($attachment_id, 'bp-better-messages-attachment', true) ) ) continue; $attachment_thread_id = (int) get_post_meta( $attachment_id, 'bp-better-messages-thread-id', true ); if ($attachment_thread_id !== ( $new_thread ? 0 : (int) $message->thread_id ) ) continue; $attachment_uploader_id = (int) get_post_meta($attachment_id, 'bp-better-messages-uploader-user-id', true); if ( $attachment_uploader_id !== (int) $message->sender_id ) continue; } if( $enable_double_check && $new_thread ) { if ( function_exists( 'Better_Messages_Files' ) ) { Better_Messages_Files()->relocate_attachment_to_thread( $attachment_id, (int) $message->thread_id ); } update_post_meta($attachment_id, 'bp-better-messages-thread-id', $message->thread_id); } $attachment_meta[ $attachment_id ] = wp_get_attachment_url( $attachment_id ); if( $enable_double_check ) { add_post_meta($attachment_id, 'bp-better-messages-message-id', $message->id, true); delete_post_meta($attachment_id, 'better-messages-waiting-for-message'); } } if( count( $attachment_meta ) > 0 ) { Better_Messages()->functions->update_message_meta($message->id, 'attachments', $attachment_meta); } } Better_Messages()->mentions->process_mentions( $message->thread_id, $message->id, $message->message ); //do_action( 'better_messages_thread_updated', $message->thread_id ); /** * Fires after a message has been successfully sent. * * @since 1.1.0 * * @param BP_Messages_Message $message Message object. Passed by reference. */ if( $is_pending === 0 ){ do_action_ref_array( 'better_messages_message_sent', array( &$message ) ); } else { Better_Messages()->functions->update_message_meta( $message->id, 'pending_args', $message ); do_action_ref_array( 'better_messages_message_pending', array( &$message ) ); } if( $r['return'] === 'message_id' ){ return (int) $message->id; } if( $r['return'] === 'both' ){ return [ 'thread_id' => (int) $message->thread_id, 'message_id' => (int) $message->id ]; } // Return the thread ID. return (int) $message->thread_id; } public function update_message_update_time( $message_id, $new_message = false, $deleted_message = false, $last_update = true ){ $microtime = Better_Messages()->functions->get_microtime(); $update_format = []; $update_args = []; if( $last_update ) { $update_args['updated_at'] = $microtime; $update_format[] = '%d'; } if( $new_message ){ $update_args['created_at'] = $microtime; $update_format[] = '%d'; } if( count( $update_args ) > 0 ){ global $wpdb; $wpdb->update( bm_get_table('messages'), $update_args, ['id' => $message_id], $update_format, ['%d'] ); } if( $deleted_message ){ Better_Messages()->functions->update_message_meta( $message_id, 'bm_deleted_time', $microtime ); } } public function update_message( $args = '' ){ global $wpdb; // Parse the default arguments. $r = bp_parse_args( $args, array( 'sender_id' => Better_Messages()->functions->get_current_user_id(), 'thread_id' => false, 'message_id' => false, 'send_push' => false, 'mobile_push' => false, 'count_unread' => false, 'notification' => false, 'show_on_site' => false, 'subject' => false, 'content' => false, 'is_update' => true ), 'better_messages_update_message' ); $message = new BM_Messages_Message( $r['message_id'] ); if( (int) $r['sender_id'] !== (int) $message->sender_id ) { return false; } #$message->recipients = $message->get_recipients(); $message->recipients = Better_Messages()->functions->get_recipients( $message->thread_id ); $message->message = apply_filters( 'better_messages_message_content_before_save', $r['content'], $message->id ); $wpdb->update(bm_get_table('messages'), [ 'message' => $message->message ], [ 'id' => $message->id ], ['%s'], ['%d']); $this->update_message_update_time( $message->id ); do_action( 'better_messages_thread_updated', $message->thread_id ); Better_Messages()->mentions->process_mentions( $message->thread_id, $message->id, $message->message ); if( function_exists('Better_Messages_WebSocket') ) { $message->count_unread = $r['count_unread'] ? true : false; $message->send_push = $r['send_push']; $message->mobile_push = $r['mobile_push']; $message->show_on_site = $r['show_on_site'] ? true : false; $message->notification = $r['notification']; $message->is_update = $r['is_update']; if( isset( $r['meta'] ) ) { $message->meta = $r['meta']; } else { $message->meta = []; } Better_Messages_WebSocket()->on_message_sent($message); } return true; } function delete_all_thread_meta( $thread_id ) { global $wpdb; $table = bm_get_table('threadsmeta'); return $wpdb->query($wpdb->prepare("DELETE FROM {$table} WHERE `bm_thread_id` = %d", $thread_id) ); } function delete_all_message_meta( $message_id ) { global $wpdb; $table = bm_get_table('meta'); return $wpdb->query($wpdb->prepare("DELETE FROM {$table} WHERE `bm_message_id` = %d", $message_id) ); } public function get_last_activity( $user_id ){ return Better_Messages()->users->get_last_activity( $user_id ); } public function check_access( $thread_id, $user_id = 0, $acccess_type = 'access' ) { if ( empty( $user_id ) ) { $user_id = Better_Messages()->functions->get_current_user_id(); } $type = $this->get_thread_type( $thread_id ); if( $type === 'chat-room' ){ return $this->check_chat_room_access( $thread_id, $user_id, $acccess_type ); } if( $type === 'group' ){ return apply_filters( 'better_messages_has_access_to_group_chat', false, $thread_id, $user_id ); } $recipients = $this->get_recipients( $thread_id ); $is_overridden = apply_filters('better_messages_check_access_override', null, $thread_id, $user_id, $acccess_type ); if( ! is_null( $is_overridden ) ){ return $is_overridden; } if ( isset( $recipients[ $user_id ] ) ) { return true; } else { return null; } } public function get_user_unread_count( $user_id ) { global $wpdb; return (int) $wpdb->get_var($wpdb->prepare( "SELECT SUM(unread_count) FROM " . bm_get_table('recipients') . " WHERE user_id = %d AND is_deleted = 0 ", $user_id )); } public function set_user_unread_count_for_thread( $user_id, $thread_id, $unread_count = 0 ) { if( $unread_count < 0 ) $unread_count = 0; global $wpdb; $wpdb->query( $wpdb->prepare( "UPDATE " . bm_get_table('recipients') . " SET unread_count = %d WHERE user_id = %d AND thread_id = %d", $unread_count, $user_id, $thread_id ) ); do_action('better_messages_set_user_thread_unread_count', $user_id, $thread_id, $unread_count ); Better_Messages()->functions->thread_updated_for_user($thread_id, $user_id); } public function check_chat_room_access( $thread_id, $user_id, $type ){ if( $type === 'reply' ){ $recipients = $this->get_recipients( $thread_id ); if ( isset( $recipients[ $user_id ] ) ) { return true; } else { return false; } } return true; } public function user_has_role( $user_id, $roles = [] ){ if( ! $this->is_valid_user_id( $user_id ) ) { return false; } $user_roles = $this->get_user_roles( $user_id ); $has_role = false; foreach( $user_roles as $user_role ){ if( in_array( $user_role, $roles ) ){ $has_role = true; } } return $has_role; } public function get_microtime(){ $max_int = strlen( PHP_INT_MAX ); $length = 14; if( $max_int < $length ) $length = $max_int; $microtime = str_replace('.', '', (string) microtime(true)) ; if( strlen($microtime) > $length ){ $microtime = substr( $microtime, 0, $length ); } if( strlen( $microtime ) < $length ){ $microtime = str_pad($microtime, $length, '0', STR_PAD_RIGHT); } return (int) $microtime; } public function to_microtime( $time ) { $time = (string) $time; $max_int = strlen( PHP_INT_MAX ); $length = 14; if( $max_int < $length ) $length = $max_int; if( strlen($time) > $length ){ $microtime = substr( $time, 0, $length ); } if( strlen( $time ) < $length ){ $microtime = str_pad($time, $length, '0', STR_PAD_RIGHT); } return (int) $microtime; } function add_hash_arg( $subpage, ...$args ) { if ( is_array( $args[0] ) ) { if ( count( $args ) < 2 || false === $args[1] ) { $uri = $_SERVER['REQUEST_URI']; } else { $uri = $args[1]; } } else { if ( count( $args ) < 3 || false === $args[2] ) { $uri = $_SERVER['REQUEST_URI']; } else { $uri = $args[2]; } } $frag = strstr( $uri, '#' ); if ( $frag ) { $uri = substr( $uri, 0, -strlen( $frag ) ); } else { $frag = ''; } if ( 0 === stripos( $uri, 'http://' ) ) { $protocol = 'http://'; $uri = substr( $uri, 7 ); } elseif ( 0 === stripos( $uri, 'https://' ) ) { $protocol = 'https://'; $uri = substr( $uri, 8 ); } else { $protocol = ''; } $hashAdded = false; if ( strpos( $uri, '?' ) !== false ) { list( $base, $query ) = explode( '?', $uri, 2 ); $base .= '?'; } elseif ( $protocol || strpos( $uri, '=' ) === false ) { $base = $uri . '#/' . $subpage . '?&'; $hashAdded = true; $query = ''; } else { $base = ''; $query = $uri; } wp_parse_str( $query, $qs ); $qs = urlencode_deep( $qs ); // This re-URL-encodes things that were already in the query string. $hash_args = []; if ( is_array( $args[0] ) ) { foreach ( $args[0] as $k => $v ) { $hash_args[ $k ] = $v; } } else { $qs[ $args[0] ] = $args[1]; } $ret = build_query( $qs ); $ret = trim( $ret, '?' ); $ret = preg_replace( '#=(&|$)#', '$1', $ret ); $ret = $protocol . $base . $ret . $frag; $ret = rtrim( $ret, '?' ); $ret = str_replace( '?#', '#', $ret );; $hasgArgsAdded = false; if( ! $hashAdded ){ $ret .= '#/' . $subpage; $hasgArgsAdded = true; if( count( $hash_args ) > 0 ){ $ret .= '?&'; foreach ( $hash_args as $key => $value ){ $ret .= $key . '=' . $value . '&'; } } } if( ! $hasgArgsAdded && str_ends_with( $ret, '?&') ){ if( count( $hash_args ) > 0 ){ foreach ( $hash_args as $key => $value ){ $ret .= $key . '=' . $value . '&'; } } } if( str_ends_with( $ret, '?&') ){ $ret = substr($ret, 0, -2); } if( str_ends_with( $ret, '=&') ){ $ret = substr($ret, 0, -2); } return $ret; } public function can_moderate_thread( int $thread_id, int $user_id ){ if( $this->is_thread_super_moderator( $user_id, $thread_id ) ){ return true; } if( $this->is_thread_moderator( $thread_id, $user_id ) ){ return true; } return false; } public function is_thread_moderator( int $thread_id, int $user_id ){ $type = Better_Messages()->functions->get_thread_type( $thread_id ); if( $type !== 'chat-room' ) { return false; } $moderators = $this->get_moderators( $thread_id ); return in_array( ( int ) $user_id, $moderators); } public function get_moderators( $thread_id ){ $moderators = $this->get_thread_meta( $thread_id, 'moderators' ); if( ! is_array( $moderators ) ){ $moderators = []; } return (array) array_map( 'intval', array_values($moderators) ); } public function add_moderator( $thread_id, $user_id ){ $moderators = $this->get_moderators( $thread_id ); if ( ! in_array( ( int ) $user_id, $moderators) ) { $moderators[] = (int) $user_id; $this->update_thread_meta( $thread_id, 'moderators', array_unique( $moderators ) ); do_action( 'better_messages_thread_updated', $thread_id ); do_action( 'better_messages_info_changed', $thread_id ); } } /** * @param $thread_id * @param $user_id * @return string */ public function get_user_thread_url($thread_id, $user_id ): string { return $this->get_user_messages_url( $user_id, $thread_id ); } public function remove_moderator( $thread_id, $user_id ){ $moderators = $this->get_moderators( $thread_id ); if (( $key = array_search( ( int ) $user_id, $moderators ) ) !== false) { unset( $moderators[$key] ); $this->update_thread_meta( $thread_id, 'moderators', array_unique( $moderators ) ); do_action( 'better_messages_thread_updated', $thread_id ); do_action( 'better_messages_info_changed', $thread_id ); } } /** * * @return string */ public function plugin_mode(){ if( class_exists('BuddyPress') ){ return 'buddypress'; } return 'wordpress'; } public function redirect_to_messages_link( $thread_id = false ){ $array = ['bm-redirect-to-messages' => '']; if( $thread_id ){ $array['thread-id'] = $thread_id; } return add_query_arg($array, site_url('/')); } public static function get_total_threads_for_user( $user_id, $type = 'all' ) { global $wpdb; $exclude_sender = $type_sql = ''; if ( $type === 'unread' ) { $type_sql = 'AND unread_count != 0'; } elseif ( $type === 'read' ) { $type_sql = 'AND unread_count = 0'; } return (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(thread_id) FROM " . bm_get_table('recipients') . " WHERE user_id = %d AND is_deleted = 0 {$exclude_sender} {$type_sql}", $user_id ) ); } public function get_message_ranges( $message_ids = [] ){ if( count( $message_ids ) < 2 ) return []; sort( $message_ids ); $min = $message_ids[0]; $currentRange = 0; $preRanges = []; foreach ($message_ids as $element) { if( $min + 1 < $element ) { $currentRange++; } $preRanges[$currentRange][] = $element; $min = $element; } $ranges = []; $lastMax = false; foreach ( $preRanges as $preRange ) { if( ! $lastMax ){ $lastMax = max( $preRange ); continue; } $range = [ $lastMax, min( $preRange ) ]; $lastMax = max( $preRange ); $ranges[] = $range; //$ranges[] = [min($preRange), max($preRange)]; } return $ranges; } public function get_missed_message_ids( $thread_id, $message_ids = [] ){ global $wpdb; $ranges = $this->get_message_ranges( $message_ids ); if( count( $ranges ) === 0 ) return []; $args = [ $thread_id ]; $betweens = []; foreach( $ranges as $range ){ $args[] = $range[0] + 1; $args[] = $range[1] - 1; $betweens[] = 'id BETWEEN %d AND %d'; } $query = $wpdb->prepare("SELECT id FROM " . bm_get_table('messages') . " messages WHERE thread_id = %d AND (" . implode( ' OR ', $betweens ) . ")", $args ); return $wpdb->get_col($query); } public function threads_placeholder( $loop_times = 10 ){ ob_start(); echo '<div class="threads-list" style="padding-top:0; margin-top:0;opacity: 0.6; overflow: hidden;">'; for ($k = 0 ; $k < $loop_times; $k++){ echo '<div class="thread"><div class="pic" style="top: 0;"><span class="avatar bbpm-avatar"><div class="bm-placeholder-wrapper" style="position: relative; width: 30px; height: 30px; border-radius: 4px; overflow: hidden;"><div class="bm-placeholder"><div class="bm-animated-background"></div></div></div></span></div><div class="bm-info"><h4 class="name"><div class="bm-placeholder-wrapper" style="position: relative; width: 100px; height: 15px; border-radius: 4px; overflow: hidden;"><div class="bm-placeholder"><div class="bm-animated-background"></div></div></div></h4><h4><div class="bm-placeholder-wrapper" style="position: relative; width: 80px; height: 10px; border-radius: 4px; overflow: hidden;"><div class="bm-placeholder"><div class="bm-animated-background"></div></div></div></h4><div class="last-message"><div class="bm-last-message-content"><div class="bm-placeholder-wrapper" style="position: relative; min-width: 150px; max-width: 350px; width: 100%; height: 15px; border-radius: 4px; overflow: hidden;"><div class="bm-placeholder"><div class="bm-animated-background"></div></div></div></div></div></div><div class="time"><span class="time-wrapper"><div class="bm-placeholder-wrapper" style="position: relative; width: 50px; height: 15px; border-radius: 4px; overflow: hidden;"><div class="bm-placeholder"><div class="bm-animated-background"></div></div></div></span></div><div class="actions"><span class="delete"></span></div></div>'; } echo '</div>'; return ob_get_clean(); } public function container_placeholder(){ $initialHeight = (int) apply_filters( 'bp_better_messages_max_height', Better_Messages()->settings['messagesHeight'] ); ob_start(); ?> <div class="bp-messages-wrap" style="height:<?php echo $initialHeight; ?>px"> <div class="chat-header"> <div style="position: relative; width:200px; height: 20px; margin-left: 10px; border-radius: 4px; overflow: hidden"> <div class="bm-placeholder"><div class="bm-animated-background"></div></div> </div> <div style="position: relative; width:100px; height: 20px; margin-left: auto;margin-right:10px;border-radius: 4px; overflow: hidden"> <div class="bm-placeholder"><div class="bm-animated-background"></div></div> </div> </div> <?php echo $this->threads_placeholder(); ?> </div> <?php return ob_get_clean(); } public function generateRandomString($length = 25) { $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; $charactersLength = strlen($characters); $randomString = ''; for ($i = 0; $i < $length; $i++) { $randomString .= $characters[rand(0, $charactersLength - 1)]; } return $randomString; } public function get_rest_api_url($namespace = 'better-messages/v1'){ return esc_url_raw(get_rest_url(null, '/' . $namespace . '/') ); } public function thread_updated_for_user( int $thread_id, int $user_id, $update_table = true ){ global $wpdb; do_action( 'better_messages_thread_self_update', $thread_id, $user_id ); if( $update_table ) { $wpdb->update(bm_get_table('recipients'), ['last_update' => Better_Messages()->functions->get_microtime()], ['thread_id' => $thread_id, 'user_id' => $user_id], ['%d'], ['%d', '%d'] ); } } public function threads_order_sql(){ if( Better_Messages()->settings['pinnedThreads'] == '1' ) { $sql = "GROUP BY `threads`.`id`, `recipients`.`is_pinned` ORDER BY is_pinned DESC, created_at DESC"; } else { $sql = "GROUP BY `threads`.`id` ORDER BY created_at DESC"; } return $sql; } public function record_message_edit_history( $message_id, $old_message, $edited_by = false ){ $history = Better_Messages()->functions->get_message_meta( $message_id, 'edit_history' ); if( ! $history || ! is_array( $history ) ){ $history = []; } if( ! $edited_by ){ $edited_by = Better_Messages()->functions->get_current_user_id(); } $edit_time = time(); $edit_item = [ 'user_id' => $edited_by, 'old_message' => $old_message ]; $history[$edit_time] = $edit_item; Better_Messages()->functions->update_message_meta( $message_id, 'edit_history', $history ); } public function get_message_last_edit( $message_id ){ $history = Better_Messages()->functions->get_message_meta( $message_id, 'edit_history' ); if( ! $history || ! is_array( $history ) ){ return false; } $timestamps = array_keys( $history ); $last_edit = max($timestamps); return date('Y-m-d H:i:s', $last_edit); } public function get_current_user_id(){ $forced_user_id = apply_filters( 'better_messages_forced_current_user_id', null ); if( $forced_user_id !== null ){ return (int) $forced_user_id; } if( is_user_logged_in() ){ return (int) apply_filters('better_messages_logged_in_user_id', get_current_user_id() ); } else { return (int) apply_filters('better_messages_guest_user_id', 0); } } public function is_valid_user_id( $user_id ){ if( $user_id > 0 ){ $user = get_userdata( $user_id ); if( ! $user ){ return false; } } elseif ( $user_id < 0 ){ $guest = Better_Messages()->guests->get_guest_user( $user_id ); if( ! $guest ){ return false; } } else { return false; } return true; } public function is_user_authorized(){ return (bool) $this->get_current_user_id() !== 0; } public function update_user_meta( $user_id, $meta_key, $meta_value, $prev_value = '' ){ if( $user_id > 0 ){ return update_user_meta($user_id, $meta_key, $meta_value, $prev_value ); } else { return Better_Messages()->guests->update_guest_meta( $user_id, $meta_key, $meta_value ); } } public function get_user_meta( $user_id, $key = '', $single = false ){ if( $user_id > 0 ){ return get_user_meta($user_id, $key, $single); } else { return Better_Messages()->guests->get_guest_meta( $user_id, $key ); } } public function delete_user_meta( $user_id, $meta_key, $meta_value = '' ){ if( $user_id > 0 ){ return delete_user_meta( $user_id, $meta_key, $meta_value); } else { return Better_Messages()->guests->delete_guest_meta( $user_id, $meta_key ); } } public function get_restrict_to_roles( $user_id ): array { $restricted_roles = (array) Better_Messages()->settings['restrictRoleBlock']; $user_roles = Better_Messages()->functions->get_user_roles( $user_id ); $restrict_to = []; foreach( $restricted_roles as $restricted_role ){ if( in_array($restricted_role['from'], $user_roles) ){ $restrict_to[ $restricted_role['to'] ] = $restricted_role['message']; } } return $restrict_to; } public function get_user_roles( $user_id ){ if( $user_id > 0 ){ $user = get_userdata( $user_id ); if( ! $user ){ return []; } return apply_filters( 'better_messages_get_user_roles', (array) $user->roles, $user_id ); } else { return apply_filters( 'better_messages_get_user_roles', ['bm-guest'], $user_id ); } } public function get_pending_messages_count(): int { global $wpdb; return (int) $wpdb->get_var( "SELECT COUNT(*) FROM `" . bm_get_table('messages') . "` WHERE `is_pending` != 0" ); } public function get_user_secret_key( $user_id ){ if( $user_id <= 0 ){ return 'unencrypted'; } $secret_key = Better_Messages()->functions->get_user_meta( $user_id, 'bpbm_secret_key', true ); if( empty($secret_key) ){ $secret_key = $this->random_string(20); Better_Messages()->functions->update_user_meta( $user_id, 'bpbm_secret_key', $secret_key ); } return $secret_key; } public function is_response_good($response) { // Check if the request was successful if ( is_wp_error($response) ) { // Handle the error appropriately return new WP_Error('request_failed', 'The network request failed.'); } // Check if the request was authorized if (wp_remote_retrieve_response_code($response) == 401) { // Handle the authorization error return new WP_Error('unauthorized', 'The request was not authorized.'); } return true; } public function random_string($length): string { $key = ''; $keys = array_merge(range(0, 9), range('a', 'z')); for ($i = 0; $i < $length; $i++) { $key .= $keys[array_rand($keys)]; } return $key; } public function get_client_ip(){ $ip = ''; if ( isset($_SERVER['HTTP_CLIENT_IP']) && ! empty($_SERVER['HTTP_CLIENT_IP'])) { $ip = $_SERVER['HTTP_CLIENT_IP']; } elseif ( isset($_SERVER['HTTP_X_FORWARDED_FOR']) && ! empty($_SERVER['HTTP_X_FORWARDED_FOR'] )) { $ip = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR'])[0]; } else if( isset($_SERVER['REMOTE_ADDR']) && ! empty($_SERVER['REMOTE_ADDR'] ) ){ $ip = $_SERVER['REMOTE_ADDR']; } return $ip; } public function get_site_domain() { $site_url = get_site_url(); $parse = parse_url($site_url); return $parse['host']; } public function get_allowedtags() { global $allowedtags; return array_merge_recursive( $allowedtags, array( 'a' => array( 'aria-label' => array(), 'class' => array(), 'data-bp-tooltip' => array(), 'id' => array(), 'rel' => array(), ), 'img' => array( 'src' => array(), 'alt' => array(), 'width' => array(), 'height' => array(), 'class' => array(), 'id' => array(), ), 'span'=> array( 'class' => array(), 'data-livestamp' => array(), ), 'ul' => array(), 'ol' => array(), 'li' => array(), ) ); } public function messages_filter_kses( $content ) { $messages_allowedtags = $this->get_allowedtags(); $messages_allowedtags['p'] = array(); /** * Filters the allowed HTML tags for BuddyPress Messages content. * * @since 3.0.0 * * @param array $value Array of allowed HTML tags and attributes. */ $messages_allowedtags = apply_filters( 'better_messages_allowed_tags', $messages_allowedtags ); return wp_kses( $content, $messages_allowedtags ); } function current_time( $gmt = true, $type = 'mysql' ) { return current_time( $type, $gmt ); } function end_browser_output() { ignore_user_abort(true); set_time_limit(0); if ( function_exists('fastcgi_finish_request') ) { fastcgi_finish_request(); } else if ( function_exists( 'litespeed_finish_request' ) ) { litespeed_finish_request(); } else { ob_end_flush(); flush(); } } } endif; /** * @return Better_Messages_Functions instance | null */ function Better_Messages_Functions() { return Better_Messages_Functions::instance(); } if( ! function_exists('BP_Better_Messages_Functions') ) { function BP_Better_Messages_Functions() { return Better_Messages_Functions(); } }
Save
Cancel