name = __('Duplicate'); $this->description = __('Same comments on others blogs of a multiblog'); } public function isSpam($type, $author, $email, $site, $ip, $content, $post_id, &$status) { if ($type != 'comment') { return null; } if (strlen($content) < $this->getMinLength()) { return null; } try { if ($this->isDuplicate($content, $ip)) { $this->markDuplicate($content, $ip); $status = 'Duplicate on other blog'; return true; } return null; } catch (Exception $e) { throw new Exception($e->getMessage()); } } public function isDuplicate($content, $ip) { $rs = dcCore::app()->con->select( 'SELECT C.comment_id ' . 'FROM ' . dcCore::app()->prefix . dcBlog::COMMENT_TABLE_NAME . ' C ' . 'LEFT JOIN ' . dcCore::app()->prefix . 'post P ON C.post_id=P.post_id ' . "WHERE P.blog_id != '" . dcCore::app()->blog->id . "' " . "AND C.comment_content='" . dcCore::app()->con->escape($content) . "' " . "AND C.comment_ip='" . $ip . "' " ); return !$rs->isEmpty(); } public function markDuplicate($content, $ip) { $cur = dcCore::app()->con->openCursor(dcCore::app()->prefix . dcBlog::COMMENT_TABLE_NAME); dcCore::app()->con->writeLock(dcCore::app()->prefix . dcBlog::COMMENT_TABLE_NAME); $cur->comment_status = -2; $cur->comment_spam_status = 'Duplicate on other blog'; $cur->comment_spam_filter = 'dcFilterDuplicate'; $cur->update( "WHERE comment_content='" . dcCore::app()->con->escape($content) . "' " . "AND comment_ip='" . $ip . "' " ); dcCore::app()->con->unlock(); $this->triggerOtherBlogs($content, $ip); } public function gui(string $url): string { if (dcCore::app()->auth->isSuperAdmin()) { dcCore::app()->blog->settings->dcFilterDuplicate->drop('dcfilterduplicate_minlen'); if (isset($_POST['dcfilterduplicate_minlen'])) { dcCore::app()->blog->settings->dcFilterDuplicate->put( 'dcfilterduplicate_minlen', abs((int) $_POST['dcfilterduplicate_minlen']), 'integer', 'Minimum lenght of comment to filter', true, true ); dcPage::addSuccessNotice(__('Configuration successfully updated.')); http::redirect($url); } return '
'; } return '' . sprintf( __('Super administrator set the minimum length of comment content to %d chars.'), $this->getMinlength() ) . '
'; } private function getMinLength() { return abs((int) dcCore::app()->blog->settings->dcFilterDuplicate->getGlobal('dcfilterduplicate_minlen')); } public function triggerOtherBlogs($content, $ip) { $rs = dcCore::app()->con->select( 'SELECT P.blog_id ' . 'FROM ' . dcCore::app()->prefix . dcBlog::COMMENT_TABLE_NAME . ' C ' . 'LEFT JOIN ' . dcCore::app()->prefix . 'post P ON C.post_id=P.post_id ' . "WHERE C.comment_content='" . dcCore::app()->con->escape($content) . "' " . "AND C.comment_ip='" . $ip . "' " ); while ($rs->fetch()) { $b = new dcBlog($rs->blog_id); $b->triggerBlog(); unset($b); } } }