sakura/app/models/comment-model.php
2021-07-09 18:28:29 +08:00

232 lines
7.5 KiB
PHP

<?php
namespace Sakura\Models;
use Sakura\Lib\Exception;
use Sakura\Models\BaseModel;
use Sakura\Utils\UaParser;
use Sakura\Utils\IpParser;
use Sakura\Controllers\AvatarController;
class CommentModel extends BaseModel
{
public static $ancestor_id_meta_key = 'ancestor_id';
public static $user_agent_info_meta_key = 'user_agent_info';
public static $user_location_meta_key = 'user_location';
public static function get_comments(array $comment_IDs)
{
return get_comments(['comment__in' => $comment_IDs]);
}
public static function get_comment(int $comment_ID)
{
return get_comment($comment_ID);
}
public static function get_comment_childern(int $comment_ID)
{
return get_comments(['parent' => $comment_ID]);
}
public static function get_comments_of_post(int $post_id)
{
return get_comments(['post_id' => $post_id]);
}
public static function get_comment_parent_id(int $comment_ID)
{
$comment = self::get_comments([$comment_ID]);
return intval($comment[0]->comment_parent);
}
public static function get_comment_ancestor_id(int $comment_ID, $target = true)
{
$parent_id = self::get_comment_parent_id($comment_ID);
if ($parent_id > 0) {
return self::get_comment_ancestor_id($parent_id, false);
} else {
return $target ? $parent_id : $comment_ID;
}
}
public static function set_comment_ancestor_meta(int $comment_ID)
{
$ancestor_id = self::get_comment_ancestor_id($comment_ID);
add_comment_meta($comment_ID, self::$ancestor_id_meta_key, $ancestor_id, true);
return $ancestor_id;
}
public static function update_comment_ancestor_meta(int $comment_ID)
{
$ancestor_id = self::get_comment_ancestor_id($comment_ID);
update_comment_meta($comment_ID, self::$ancestor_id_meta_key, $ancestor_id);
return $ancestor_id;
}
/**
* Get ancestor id from meta
*
* @param integer $comment_ID
* @param boolean $display If ture, will throw error if meta not exist. If flase, will return NULL if not exist.
* @return void
*/
public static function get_comment_ancestor_meta(int $comment_ID, $display = false)
{
$ancestor_id = get_comment_meta($comment_ID, self::$ancestor_id_meta_key, true);
if ($ancestor_id == '0') {
return 0;
} elseif (!$ancestor_id) {
if ($display) {
throw new Exception("Please init ancestor_id first");
}
return NULL;
} else {
return intval($ancestor_id);
}
}
public static function set_comment_user_agent_info_meta(int $comment_ID)
{
$user_agent = self::get_comment($comment_ID)->comment_agent;
$parser = new UaParser($user_agent);
$user_agent_info = $parser->get_public_display_content();
add_comment_meta($comment_ID, self::$user_agent_info_meta_key, $user_agent_info, true);
return $user_agent_info;
}
public static function update_comment_user_agent_info_meta(int $comment_ID)
{
$user_agent = self::get_comment($comment_ID)->comment_agent;
$parser = new UaParser($user_agent);
$user_agent_info = $parser->get_public_display_content();
update_comment_meta($comment_ID, self::$user_agent_info_meta_key, $user_agent_info);
return $user_agent_info;
}
/**
* Get user agent info from meta
*
* @param integer $comment_ID
* @param boolean $display If ture, will throw error if meta not exist. If flase, will return [] if not exist.
* @return void
*/
public static function get_comment_user_agent_info_meta(int $comment_ID, $display = false)
{
$user_agent_info = get_comment_meta($comment_ID, self::$user_agent_info_meta_key, false);
if (empty($user_agent_info) && $display) {
throw new Exception("Please init user_agent_info first");
}
return $user_agent_info;
}
public static function set_comment_user_location_meta(int $comment_ID)
{
$comment_author_IP = self::get_comment($comment_ID)->comment_author_IP;
$location = IpParser::get_location($comment_author_IP);
add_comment_meta($comment_ID, self::$user_location_meta_key, $location, true);
return $location;
}
public static function update_comment_user_location_meta(int $comment_ID)
{
$comment_author_IP = self::get_comment($comment_ID)->comment_author_IP;
$location = IpParser::get_location($comment_author_IP);
update_comment_meta($comment_ID, self::$user_location_meta_key, $location);
return $location;
}
/**
* Get user location from meta
*
* @param integer $comment_ID
* @param boolean $display If ture, will throw error if meta not exist. If flase, will return false if not exist.
* @return void
*/
public static function get_comment_user_location_meta(int $comment_ID, $display = false)
{
$location = get_comment_meta($comment_ID, self::$user_location_meta_key, true);
if (empty($location) && $display) {
throw new Exception("Please init user_location first");
}
return $location;
}
/**
* Get comment public display meta
*
* @param array string|array $args Optional. Array or string of arguments. See WP_Comment_Query::__construct() for information on accepted arguments. Default empty.
* @return void
*/
public static function get_comments_with_public_fields(array $args)
{
$comments = get_comments($args);
$output_comments = [];
foreach ($comments as $comment) {
$output_comment = [
'id' => intval($comment->comment_ID),
'post' => intval($comment->comment_post_ID),
'parent' => intval($comment->comment_parent),
'author' => intval($comment->user_id),
'author_name' => $comment->comment_author,
// 'comment_author_email' => $comment->comment_author_email,
'author_url' => $comment->comment_author_url,
// 'comment_author_IP' => $comment->comment_author_IP,
'date' => $comment->comment_date,
'date_gmt' => $comment->comment_date_gmt,
'content' => [
'rendered' => '', // TODO
'plain' => $comment->comment_content
],
'link' => '', // TODO: get_comment_link(),
// 'comment_karma' => $comment->comment_karma,
'status' => $comment->comment_approved === '1' ? 'approved' : '', // TODO
// 'comment_agent' => $comment->comment_agent,
'type' => $comment->comment_type,
'author_avatar_urls' => AvatarController::get_avatar($comment->comment_author_email),
];
$output_comment['meta_fields'] = self::get_comment_meta_fields($comment->comment_ID);
array_push($output_comments, $output_comment);
}
return $output_comments;
}
/**
* Add fields to input array $comment and return it
*
* @param integer $comment_ID
*
* @return void
*/
public static function get_comment_meta_fields(int $comment_ID)
{
$meta = [];
// $ancestor_id = self::get_comment_ancestor_meta($comment_ID);
// if ($ancestor_id === NULL) {
// $ancestor_id = self::set_comment_ancestor_meta($comment_ID);
// }
// $meta['ancestor_id'] = $ancestor_id;
$user_agent_info = self::get_comment_user_agent_info_meta($comment_ID);
if (empty($user_agent_info)) {
$user_agent_info = self::set_comment_user_agent_info_meta($comment_ID);
}
$meta['user_agent_info'] = $user_agent_info;
$user_location = self::get_comment_user_location_meta($comment_ID);
// TODO: not fully tested if '' or false or NULL
// TODO: language option
if ($user_location === '') {
$user_location = self::set_comment_user_location_meta($comment_ID);
}
$meta['user_location'] = $user_location;
return $meta;
}
}