| Server IP : 43.141.49.92 / Your IP : 113.219.202.141 Web Server : Apache System : Linux VM-8-5-opencloudos 6.6.34-9.oc9.x86_64 #1 SMP PREEMPT_DYNAMIC Wed Jun 19 19:35:45 CST 2024 x86_64 User : www ( 1000) PHP Version : 8.1.27 Disable Function : passthru,exec,system,putenv,chroot,chgrp,chown,shell_exec,popen,proc_open,pcntl_exec,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,imap_open,apache_setenv MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /www/wwwroot/www.ucppt.com/wp-content/plugins/wpcom-member-pro/includes/ |
Upload File : |
<?php
namespace WPCOM\Member;
defined( 'ABSPATH' ) || exit;
if(!class_exists( Messages::class )):
class Messages{
protected $table;
function __construct(){
global $wpdb;
$this->table = $wpdb->prefix . 'wpcom_messages';
add_action( 'admin_menu', array($this, 'init') );
add_action( 'wpcom_profile_after_description', array($this, 'add_btn'), 11 );
add_action( 'wpcom_follow_item_action', array($this, 'add_btn'), 11 );
add_action( 'wpcom_user_card_action', array($this, 'add_btn'), 11 );
add_action( 'wp_ajax_wpcom_message_box', array($this, 'message_box') );
add_action( 'wp_ajax_nopriv_wpcom_message_box', array($this, 'message_box') );
add_action( 'wp_ajax_wpcom_send_message', array($this, 'send_message') );
add_action( 'wp_ajax_nopriv_wpcom_send_message', array($this, 'send_message') );
add_action( 'wp_ajax_wpcom_load_messages', array($this, 'load_messages') );
add_action( 'wp_ajax_wpcom_read_messages', array($this, 'read_messages') );
add_action( 'wp_ajax_wpcom_check_messages', array($this, 'check_messages') );
add_action( 'wpcom_account_tabs_messages', array($this, 'messages_list') );
add_action( 'wpcom_themer_maybe_updated', array($this, 'init_database') );
add_filter( 'wpcom_account_tabs', array($this, 'messages_tab'), 20 );
add_filter( 'wpcom_unread_messages_count', array($this, 'get_unread_count'), 10, 2);
}
function init(){
add_submenu_page('users.php', _x('Messages', 'list', WPCMP_TD), _x('Messages', 'list', WPCMP_TD), 'manage_options', 'wpcom-messages', array($this, 'admin_page'), 3);
}
function messages_tab($tabs){
$tabs[35] = array(
'slug' => 'messages',
'title' => __('Messages', WPCMP_TD),
'icon' => 'mail-circle'
);
return $tabs;
}
function messages_list(){
global $wpcom_member;
$page = get_query_var('pageid') ? get_query_var('pageid') : 1;
$user_id = get_current_user_id();
$args = array(
'user' => $user_id,
'list' => $this->get_messages_list($user_id, 10, $page),
'pages' => $this->get_messages_list_pages($user_id, 10),
'paged' => $page
);
echo $wpcom_member->load_template('message-list', $args);
}
function add_btn($user){
echo '<button type="button" class="wpcom-btn btn-primary btn-xs btn-message j-message" data-user="'.$user.'">'.wpmx_icon('mail-fill', false).__('Message', WPCMP_TD).'</button>';
}
function message_box(){
global $wpcom_member;
$res = array('result' => 0);
$user_id = get_current_user_id();
$user_to = isset($_REQUEST['user']) && $_REQUEST['user'] ? $_REQUEST['user'] : 0;
if(!$user_id) {
$res['result'] = -1;
$res['msg'] = _x('Please login first', 'message', WPCMP_TD);
}else if($user_id==$user_to){
$res['result'] = -3;
$res['msg'] = __('You can’t send yourself a private message!', WPCMP_TD);
}else{
$to_user = get_user_by('ID', $user_to);
if($to_user->ID){
$res['to_uid'] = $to_user->ID;
$res['to_uname'] = $to_user->display_name;
$res['to_url'] = wpcom_profile_url($to_user);
$res['avatar'] = get_avatar_url( $user_id );
$res['messages'] = '';
$messages = $this->get_messages($user_id, $user_to);
if($messages){
$count = count($messages);
header('Next-page: '.($count===10?'1':'0')); // 每页10条,如果不等于10条,则可能没有下一页了
foreach ($messages as $message){
$atts = array(
'message' => $message,
'user' => $user_id
);
$res['messages'] .= $wpcom_member->load_template('message', $atts);
}
}
}
}
wp_send_json($res);
}
function send_message(){
$res = array();
$user_id = get_current_user_id();
$to_user = isset($_REQUEST['to']) && $_REQUEST['to'] ? $_REQUEST['to'] : 0;
$content = esc_html(stripslashes(isset($_REQUEST['content']) && $_REQUEST['content']!=='' ? $_REQUEST['content'] : ''));
$last = isset($_REQUEST['last']) && $_REQUEST['last'] ? $_REQUEST['last'] : 0;
if($user_id){
if($user_id==$to_user){
$res['result'] = -3;
$res['msg'] = __('You can’t send yourself a private message!', WPCMP_TD);
}else{
$args = array(
'from_user' => $user_id,
'to_user' => $to_user,
'content' => $content
);
$id = $this->add_message($args);
if($id){
$message = $this->get_message($id);
$res['result'] = 0;
$res['message_id'] = $id;
$res['message_content'] = convert_smilies($message->content);
$res['message_time'] = get_date_from_gmt($message->time, 'Y-m-d H:i');
}
$res['messages'] = '';
$messages = $this->get_messages($user_id, $to_user, -$last, 100);
if(is_array($messages) && count($messages)>1){
global $wpcom_member;
foreach ($messages as $message){
$atts = array(
'message' => $message,
'user' => $user_id
);
$res['messages'] .= $wpcom_member->load_template('message', $atts);
}
}
}
}else{
$res['result'] = -1;
$res['msg'] = _x('Please login first', 'message', WPCMP_TD);
}
wp_send_json($res);
}
function load_messages(){
global $wpcom_member;
$user_id = get_current_user_id();
$user_to = isset($_REQUEST['user']) && $_REQUEST['user'] ? $_REQUEST['user'] : 0;
$last_id = isset($_REQUEST['last']) && $_REQUEST['last'] ? $_REQUEST['last'] : 0;
$messages = $this->get_messages($user_id, $user_to, $last_id);
if($messages){
$count = count($messages);
header('Next-page: '.($count===10?'1':'0')); // 每页10条,如果不等于10条,则可能没有下一页了
foreach ($messages as $message){
$atts = array(
'message' => $message,
'user' => $user_id
);
echo $wpcom_member->load_template('message', $atts);
}
}
exit;
}
function read_messages(){
$user_id = get_current_user_id();
$user_from = isset($_REQUEST['user']) && $_REQUEST['user'] ? $_REQUEST['user'] : 0;
if($user_id && $user_from){
echo $this->update_message_status($user_id, $user_from);
}else{
echo 0;
}
exit;
}
function check_messages(){
$user_id = get_current_user_id();
$to_user = isset($_REQUEST['user']) && $_REQUEST['user'] ? $_REQUEST['user'] : 0;
$last = isset($_REQUEST['last']) && $_REQUEST['last'] ? $_REQUEST['last'] : 0;
$res = array('result'=>0);
if($user_id && $to_user){
$messages = $this->get_messages($user_id, $to_user, -$last, 100);
if($messages){
global $wpcom_member;
foreach ($messages as $message){
$atts = array(
'message' => $message,
'user' => $user_id
);
$res['messages'] .= $wpcom_member->load_template('message', $atts);
}
}
}
wp_send_json($res);
}
function add_message($args){
global $wpdb;
if(isset($args['content']) && isset($args['to_user'])){
$data = array(
'from_user' => isset($args['from_user']) && $args['from_user'] ? $args['from_user'] : get_current_user_id(),
'to_user' => $args['to_user'],
'content' => $args['content'],
'type' => isset($args['type']) && $args['type'] ? $args['type'] : 'private', // private私信,notice通知
'status' => isset($args['status']) && $args['status'] ? $args['status'] : '0', // 0未读,1已读
'time' => get_gmt_from_date(current_time( 'mysql' ))
);
$format = array('%d', '%s', '%s', '%s', '%s', '%s');
$wpdb->insert($this->table, $data, $format);
return $wpdb->insert_id;
}
}
function update_message_status($user, $from, $status = '1'){
global $wpdb;
$user = $user ?: get_current_user_id();
if($user && $from){
$res = $wpdb->update($this->table, array('status' => $status), array('from_user'=>$from, 'to_user'=>$user, 'status'=>'0'));
return $res;
}
}
function get_messages($from, $to, $last=0, $num=10){
global $wpdb;
$table = $this->table;
$where_id = '';
$order = 'DESC';
if($last){
$where_id = 'AND ' . ($last>0 ? 'ID < ' . $last : 'ID > '. -$last);
if($last<0) $order = 'ASC';
}
$results = $wpdb->get_results( $wpdb->prepare("SELECT * FROM $table WHERE ((from_user = %d AND to_user = %d) OR (from_user = %d AND to_user = %d)) $where_id ORDER BY ID $order LIMIT %d", $from, $to, $to, $from, $num) );
if($results && $order==='DESC') $results = array_reverse($results);
return $results;
}
function get_message($id){
global $wpdb;
$results = $wpdb->get_results( $wpdb->prepare("SELECT * FROM $this->table WHERE ID = %d", $id) );
if($results && isset($results[0])) return $results[0];
}
function get_messages_list($user, $num=10, $paged=1){
global $wpdb;
$user = $user ?: get_current_user_id();
$limit = $wpdb->prepare("LIMIT %d, %d", $num*($paged-1), $num);
$group = $wpdb->prepare("SELECT sum(case when status = '0' AND to_user = %d then 1 else 0 end) as unread, (case when from_user = %d then to_user else from_user end) as group_user, from_user, to_user FROM $this->table WHERE (to_user = %d OR from_user = %d) AND type = 'private' GROUP BY group_user", $user, $user, $user, $user);
$list = "SELECT max(M.ID) AS mid, G.unread, G.group_user FROM $this->table as M RIGHT JOIN ($group) as G ON ((M.from_user = G.from_user AND M.to_user = G.to_user) OR (M.from_user = G.to_user AND M.to_user = G.from_user)) GROUP BY G.group_user";
$results = $wpdb->get_results( $wpdb->prepare("SELECT T.ID, T.content, T.time, T.to_user, T.from_user, (case when T.status = '0' AND T.to_user = %d then '0' else '1' end) as status, L.unread, L.group_user FROM $this->table as T RIGHT JOIN ($list) as L ON T.ID = L.mid ORDER BY status ASC, T.ID DESC $limit", $user) );
return $results;
}
function get_messages_list_pages($user, $num=10){
global $wpdb;
$user = $user ?: get_current_user_id();
$results = $wpdb->get_results($wpdb->prepare("SELECT (case when from_user = %d then to_user else from_user end) as group_user FROM $this->table WHERE (to_user = %d OR from_user = %d) AND type = 'private' GROUP BY group_user", $user, $user, $user));
$count = is_array($results) ? count($results) : 0;
return ceil($count/$num);
}
function get_unread_count($count, $user){
if(!$count){
global $wpdb;
$count = $wpdb->get_var($wpdb->prepare( "SELECT COUNT(*) FROM $this->table WHERE to_user = %s AND type = 'private' AND status = '0'", $user ));
$count = $count ?: 0;
}
return $count;
}
function init_database(){
global $wpdb;
$table = $this->table;
if( $wpdb->get_var("SHOW TABLES LIKE '$table'") != $table ){
$charset_collate = $wpdb->get_charset_collate();
require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
$create_sql = "CREATE TABLE {$table} (".
"ID BIGINT(20) NOT NULL auto_increment,".
"from_user BIGINT(20) NOT NULL,".
"to_user varchar(20) NOT NULL,".
"title longtext,".
"content longtext,".
"type varchar(20),".
"status varchar(20),".
"time datetime,".
"PRIMARY KEY (ID)) {$charset_collate};";
dbDelta( $create_sql );
}
}
function admin_page(){ ?>
<div class="wrap">
<h2><?php echo _x('Messages', 'list', WPCMP_TD);?></h2>
<form method="post">
<?php
if ( ! class_exists( 'Messages_List' ) ) require_once WPCOM_MP_DIR . 'includes/messages-list.php';
$list = new Messages_List();
$list->prepare_items();
$list->search_box(__('Search messages', WPCMP_TD), 'messages');
$list->display();
?>
</form>
</div>
<?php }
}
endif;