dbManager = $dbManager;
$this->options = $options;
$this->helper = $helper;
$this->wpdiscuzForm = $wpdiscuzForm;
$this->namespace = "wpdiscuz/v1";
$this->resource_name = "update";
$this->initRoutes();
}
public function initRoutes()
{
$routes = [];
if ($this->options->live["commentListUpdateType"] || ($this->options->live["enableBubble"] && $this->options->live["bubbleLiveUpdate"])) {
$routes["wpdiscuz"] = [
"namespace" => $this->namespace,
"resource_name" => $this->resource_name,
"data" => [
[
"methods" => "GET",
"callback" => [&$this, "checkNewComments"],
"permission_callback" => [&$this, "checkPermission"],
"args" => [
"postId" => [
"required" => true,
"type" => "number",
],
"lastId" => [
"required" => true,
"type" => "number",
],
"visibleCommentIds" => [
"required" => true,
"type" => "string",
],
],
],
]
];
}
$this->routes = apply_filters("wpdiscuz_rest_routes", $routes, $this->namespace);
}
public function registerRoutes()
{
if (!empty($this->routes)) {
foreach ($this->routes as $route) {
if ($this->isValidRoute($route)) {
register_rest_route($route["namespace"], "/" . $route["resource_name"], $route["data"]);
}
}
}
}
public function checkPermission()
{
if ($this->options->live["commentListUpdateType"] || ($this->options->live["enableBubble"] && $this->options->live["bubbleLiveUpdate"])) {
$currentUser = WpdiscuzHelper::getCurrentUser();
return !empty($currentUser->ID) || (empty($currentUser->ID) && $this->options->live["liveUpdateGuests"]);
}
return false;
}
public function checkNewComments($data)
{
$params = $data->get_params();
$response = ["ids" => [], "commentIDsToRemove" => []];
$status = current_user_can("moderate_comments") ? "all" : "approved";
$args = ["status" => $status, "post_id" => $params["postId"]];
global $wpdiscuz;
$wpdiscuz->isWpdiscuzLoaded = true;
$commentId = $this->dbManager->getLastCommentId($args);
if ($params["visibleCommentIds"]) {
$response["commentIDsToRemove"] = $this->dbManager->commentIDsToRemove($args, $params["visibleCommentIds"]);
}
$form = $this->wpdiscuzForm->getForm($params["postId"]);
if ($commentId > $params["lastId"]) {
$currentUser = WpdiscuzHelper::getCurrentUser();
$sentEmail = !empty($_COOKIE["comment_author_email_" . COOKIEHASH]) ? trim($_COOKIE["comment_author_email_" . COOKIEHASH]) : "";
$email = !empty($currentUser->ID) ? $currentUser->user_email : $sentEmail;
$newCommentIds = $this->dbManager->getNewCommentIds($args, $params["lastId"], $email, $params["visibleCommentIds"]);
$newCommentIds = apply_filters("wpdiscuz_bubble_new_comment_ids", $newCommentIds, $params["postId"], $currentUser);
if (!empty($newCommentIds)) {
$response["ids"] = $newCommentIds;
if ($this->options->live["bubbleShowNewCommentMessage"]) {
$comment = get_comment($commentId);
$comment->comment_content = apply_filters("comment_text", $comment->comment_content, $comment, ["is_wpdiscuz_comment" => true]);
$comment->comment_content = strip_tags($comment->comment_content);
if (stripos($comment->comment_content, "[/spoiler]") === false) {
$user = "";
if ($comment->user_id) {
$user = get_user_by("id", $comment->user_id);
} else if ($this->options->login["isUserByEmail"]) {
$user = get_user_by("email", $comment->comment_author_email);
}
if ($user) {
$authorName = $user->display_name ? $user->display_name : $comment->comment_author;
$authorAvatarField = $user->ID;
$gravatarUserId = $user->ID;
$gravatarUserEmail = $user->user_email;
} else {
$authorName = $comment->comment_author ? $comment->comment_author : esc_html($this->options->getPhrase("wc_anonymous"));
$authorAvatarField = $comment->comment_author_email;
$gravatarUserId = 0;
$gravatarUserEmail = $comment->comment_author_email;
}
$gravatarArgs = [
"wpdiscuz_gravatar_field" => $authorAvatarField,
"wpdiscuz_gravatar_size" => apply_filters("wpdiscuz_gravatar_size", 16),
"wpdiscuz_gravatar_user_id" => $gravatarUserId,
"wpdiscuz_gravatar_user_email" => $gravatarUserEmail,
"wpdiscuz_current_user" => $user,
];
if (function_exists("mb_substr")) {
$response["commentText"] = mb_substr($comment->comment_content, 0, 50);
} else {
$response["commentText"] = substr($comment->comment_content, 0, 50);
}
if (strlen($comment->comment_content) > strlen($response["commentText"])) {
$response["commentText"] .= "...";
}
$response["commentDate"] = esc_html($this->helper->dateDiff($comment->comment_date_gmt));
$response["commentLink"] = esc_url_raw(get_comment_link($comment));
$response["authorName"] = esc_html(apply_filters("wpdiscuz_comment_author", $authorName, $comment));
$response["avatar"] = get_avatar($gravatarArgs["wpdiscuz_gravatar_field"], $gravatarArgs["wpdiscuz_gravatar_size"], "", $authorName, $gravatarArgs);
}
}
}
}
$response["all_comments_count"] = get_comments_number($params["postId"]);
$response["all_comments_count_before_threads_html"] = "" . esc_html($this->helper->getNumber($response["all_comments_count"])) . " " . esc_html(apply_filters("wpdiscuz_comment_count_phrase", (1 == $response["all_comments_count"] ? $form->getHeaderTextSingle() : $form->getHeaderTextPlural()), $response["all_comments_count"]));
$response["all_comments_count_bubble_html"] = "";
return $response;
}
private function isValidRoute($route)
{
$isValid = empty($route) || !is_array($route) ? false : true;
if ($isValid) {
$isValid = !empty($route["namespace"]) &&
!empty($route["resource_name"]) &&
!empty($route["data"][0]["methods"]) &&
!empty($route["data"][0]["callback"]) &&
!empty($route["data"][0]["permission_callback"]);
}
return $isValid;
}
}