DiscuzX/upload/source/plugin/cloudsearch/search.class.php

576 lines
17 KiB
PHP
Raw Normal View History

2016-12-15 08:20:54 -05:00
<?php
/**
* [Discuz! X] (C)2001-2099 Comsenz Inc.
* This is NOT a freeware, use is subject to license terms
*
* $Id: search.class.php 33387 2013-06-05 03:21:26Z jeffjzhang $
*/
if(!defined('IN_DISCUZ')) {
exit('Access Denied');
}
class plugin_cloudsearch {
protected $allow = FALSE;
protected $allow_hot_topic = FALSE;
protected $allow_thread_related = FALSE;
protected $allow_forum_recommend = FALSE;
protected $allow_forum_related = FALSE;
protected $allow_collection_related = FALSE;
protected $allow_search_suggest = FALSE;
public function plugin_cloudsearch() {
global $_G, $searchparams;
$cloudAppService = Cloud::loadClass('Service_App');
$this->allow = $cloudAppService->getCloudAppStatus('search');
if($this->allow) {
$this->allow_hot_topic = $_G['setting']['my_search_data']['allow_hot_topic'];
$this->allow_thread_related = isset($_G['setting']['my_search_data']['allow_thread_related']) ? $_G['setting']['my_search_data']['allow_thread_related'] : 1;
$this->allow_recommend_related = isset($_G['setting']['my_search_data']['allow_recommend_related']) ? $_G['setting']['my_search_data']['allow_recommend_related'] : 1;
$this->allow_forum_recommend = $_G['setting']['my_search_data']['allow_forum_recommend'];
$this->allow_forum_related = $_G['setting']['my_search_data']['allow_forum_related'];
$this->allow_collection_related = $_G['setting']['my_search_data']['allow_collection_related'];
$this->allow_search_suggest = $_G['setting']['my_search_data']['allow_search_suggest'];
$this->allow_thread_related_bottom = $_G['setting']['my_search_data']['allow_thread_related_bottom'];
include_once template('cloudsearch:module');
if (!$searchparams) {
$searchHelper = Cloud::loadClass('Cloud_Service_SearchHelper');
$searchparams = $searchHelper->makeSearchSignUrl();
}
}
}
public function common() {
if(!$this->allow) {
return;
}
if ($_GET['mod'] == 'redirect' && $_GET['goto'] == 'findpost' && $_GET['ptid'] && $_GET['pid']) {
$post = get_post_by_pid($_GET['pid']);
if (empty($post)) {
$searchHelper = Cloud::loadClass('Cloud_Service_SearchHelper');
$searchHelper->myPostLog('redelete', array('pid' => $_GET['pid']));
}
}
}
public function global_footer() {
if(!$this->allow) {
return;
}
$res = '';
if(($this->allow_thread_related && $GLOBALS['page'] == 1 || $this->allow_thread_related_bottom) && CURSCRIPT == 'forum' && CURMODULE == 'viewthread') {
$res = tpl_cloudsearch_global_footer_related();
}
if($this->allow_recommend_related && CURSCRIPT == 'forum' && (CURMODULE == 'viewthread' || CURMODULE == 'forumdisplay')) {
if($this->_is_from_search_engine()) {
$res .= tpl_cloudsearch_global_footer_mini();
}
}
if ($this->allow_search_suggest) {
$params = array(
'callback' => 'cloudsearch_suggest_callback'
);
$util = Cloud::loadClass('Cloud_Service_Util');
$queryString = $util->generateSiteSignUrl($params, true);
$res .= tpl_cloudsearch_global_footer_suggest($queryString);
}
$res .= tpl_cloudsearch_global_footer_formula_output();
return $res;
}
private function _is_from_search_engine() {
$regex = "((http|https)\:\/\/)?";
$regex .= "([a-z]*.)+?(ask.com|yahoo.com|bing.com|baidu.com|soso.com|google.com|google.cn|gougou.com|sogou.com|yahoo.cn|youdao.com|google.com.hk|360.cn|360sou.com|so.com)(.[a-z]{2,3})?\/";
if(preg_match("/^$regex/i", $_SERVER['HTTP_REFERER'])) {
return true;
}
return false;
}
public function topicadmin_message($params) {
if(!$this->allow || !$params) {
return;
}
$param = $params['param'];
if($param[0] == 'admin_succeed') {
$searchHelper = Cloud::loadClass('Cloud_Service_SearchHelper');
$action = $_GET['action'];
switch($action) {
case 'moderate':
global $operations;
$moderate = empty($_GET['moderate']) ? array() : $_GET['moderate'];
foreach($moderate as $tid) {
if(!$tid = max(0, intval($tid))) {
continue;
}
foreach($operations as $operation) {
if(in_array($operation, array('stick', 'highlight', 'digest', 'bump', 'down', 'delete', 'move', 'close', 'open'))) {
if($operation == 'stick') {
$my_opt = $_GET['sticklevel'] ? 'sticky' : 'update';
} elseif($operation == 'digest') {
$my_opt = $_GET['digestlevel'] ? 'digest' : 'update';
} elseif($operation == 'highlight') {
$my_opt = $_GET['highlight_color'] ? 'highlight' : 'update';
} else {
$my_opt = $operation;
}
$data = array('tid' => $tid);
if($my_opt == 'move' && $_GET['moveto']) {
global $toforum;
$data['otherid'] = $toforum['fid'];
}
$searchHelper->myThreadLog($my_opt, $data);
}
}
}
break;
case 'banpost':
global $posts;
$banned = intval($_GET['banned']);
foreach($posts as $post) {
if ($banned) {
$searchHelper->myPostLog('ban', array('pid' => $post['pid'], 'uid' => $post['authorid']));
} else {
$searchHelper->myPostLog('unban', array('pid' => $post['pid'], 'uid' => $post['authorid']));
}
}
break;
case 'merge':
global $_G, $thread;
$othertid = intval($_GET['othertid']);
if ($thread) {
$searchHelper->myThreadLog('merge', array('tid' => $othertid, 'otherid' => $_G['tid'], 'fid' => $thread['fid']));
}
break;
case 'split':
global $_G, $pids;
$searchHelper->myThreadLog('split', array('tid' => $_G['tid']));
foreach((array)explode(',', $pids) as $pid) {
$searchHelper->myPostLog('split', array('pid' => $pid));
}
break;
case 'warn':
global $warned, $posts;
foreach((array)$posts as $k => $post) {
if($warned && !($post['status'] & 2)) {
$searchHelper->myPostLog('warn', array('pid' => $post['pid'], 'uid' => $post['authorid']));
} elseif(!$warned && ($post['status'] & 2)) {
$searchHelper->myPostLog('unwarn', array('pid' => $post['pid'], 'uid' => $post['authorid']));
}
}
break;
default:
break;
}
}
}
public function modcp_message($params) {
if(!$this->allow || !$params) {
return;
}
$param = $params['param'];
if(in_array($param[0], array('modcp_member_ban_succeed', 'modcp_mod_succeed', 'modcp_recyclebin_restore_succeed', 'modcp_recyclebin_delete_succeed'))) {
$searchHelper = Cloud::loadClass('Cloud_Service_SearchHelper');
$action = $_GET['action'];
switch($action) {
case 'member':
global $groupidnew, $member;
$my_opt = in_array($groupidnew, array(4, 5)) ? 'banuser' : 'unbanuser';
$searchHelper->myThreadLog($my_opt, array('uid' => $member['uid']));
break;
case 'moderate':
global $op, $postlist;
if($op == 'replies') {
global $postlist;
foreach((array)$postlist as $post) {
$searchHelper->myPostLog('validate', array('pid' => $post['pid']));
}
} else {
global $moderation;
foreach((array)$moderation['validate'] as $tid) {
$searchHelper->myThreadLog('validate', array('tid' => $tid));
}
}
break;
case 'recyclebin':
if(!empty($_GET['moderate'])) {
global $_G;
foreach(C::t('forum_thread')->fetch_all_by_tid_displayorder($_GET['moderate'], -1, '=', $_G['fid']) as $tid) {
if($op == 'restore') {
$searchHelper->myThreadLog('restore', array('tid' => $tid['tid']));
} elseif($op == 'delete' && $_G['group']['allowclearrecycle']) {
$searchHelper->myPostLog('delete', array('tid' => $tid['tid']));
}
}
}
break;
default:
break;
}
}
}
public function viewthread_message($params) {
if(!$this->allow || !$params) {
return;
}
$param = $params['param'];
if ($param[0] == 'thread_nonexistence' && $_GET['tid']) {
$searchHelper = Cloud::loadClass('Cloud_Service_SearchHelper');
$searchHelper->myThreadLog('redelete', array('tid' => $_GET['tid']));
}
}
public function space_message($params) {
if(!$this->allow || !$params) {
return;
}
$param = $params['param'];
if ($param[0] == 'thread_delete_succeed') {
global $moderate;
$searchHelper = Cloud::loadClass('Cloud_Service_SearchHelper');
foreach((array)$moderate as $tid) {
$searchHelper->myThreadLog('delete', array('tid' => $tid));
}
}
}
public function post_message($params) {
if(!$this->allow || !$params) {
return;
}
global $_G, $isfirstpost, $pid, $modnewthreads, $pinvisible;
$param = $params['param'];
$searchHelper = Cloud::loadClass('Cloud_Service_SearchHelper');
if($param[0] == 'post_edit_delete_succeed' && !empty($_GET['delete']) && $isfirstpost) {
$searchHelper->myThreadLog('delete', array('tid' => $_G['tid']));
} elseif($param[0] == 'post_edit_delete_succeed' && !empty($_GET['delete'])) {
$searchHelper->myPostLog('delete', array('pid' => $pid));
} elseif($param[0] == 'post_edit_succeed' && !$modnewreplies && $pinvisible != -3) {
$searchHelper->myPostLog('update', array('pid' => $pid));
}
}
public function deletemember($params) {
$uids = $params['param'][0];
$step = $params['step'];
if($step == 'delete' && is_array($uids)) {
$searchHelper = Cloud::loadClass('Cloud_Service_SearchHelper');
foreach($uids as $uid) {
$searchHelper->myThreadLog('deluser', array('uid' => $uid));
}
}
}
public function deletepost($params) {
$pids = $params['param'][0];
$idtype = $params['param'][1];
$step = $params['step'];
if($step == 'delete' && $idtype == 'pid' && is_array($pids)) {
$searchHelper = Cloud::loadClass('Cloud_Service_SearchHelper');
foreach($pids as $pid) {
$searchHelper->myPostLog('delete', array('pid' => $pid));
}
}
}
public function deletethread($params) {
$tids = $params['param'][0];
$step = $params['step'];
if($step == 'delete' && is_array($tids)) {
$searchHelper = Cloud::loadClass('Cloud_Service_SearchHelper');
foreach($tids as $tid) {
$searchHelper->myThreadLog('delete', array('tid' => $tid));
}
}
}
public function undeletethreads($params) {
$tids = $params['param'][0];
if(is_array($tids)) {
$searchHelper = Cloud::loadClass('Cloud_Service_SearchHelper');
foreach($tids as $tid) {
$searchHelper->myThreadLog('restore', array('tid' => $tid));
}
}
}
public function recyclebinpostundelete($params) {
$pids = $params['param'][0];
if(is_array($pids)) {
$searchHelper = Cloud::loadClass('Cloud_Service_SearchHelper');
foreach($pids as $pid) {
$searchHelper->myPostLog('restore', array('pid' => $pid));
}
}
}
public function threadpubsave($params) {
global $thread;
$step = $params['step'];
$posts = $params['posts'];
if($step == 'save') {
$searchHelper = Cloud::loadClass('Cloud_Service_SearchHelper');
if ($thread['tid']) {
$searchHelper->myThreadLog('update', array('tid' => $thread['tid']));
}
if($thread['replies'] && is_array($posts)) {
foreach($posts as $post) {
$searchHelper->myPostLog('update', array('pid' => $post['pid']));
}
}
}
}
}
class plugin_cloudsearch_member extends plugin_cloudsearch {
}
class plugin_cloudsearch_forum extends plugin_cloudsearch {
public function index_catlist_top_output() {
if(!$this->allow || !$this->allow_hot_topic) {
return;
}
global $searchparams;
$searchHelper = Cloud::loadClass('Service_SearchHelper');
$recwords = $searchHelper->getRecWords(14, 'assoc');
$srchotquery = '';
if(!empty($searchparams['params'])) {
foreach($searchparams['params'] as $key => $value) {
$srchotquery .= '&' . $key . '=' . rawurlencode($value);
}
}
return tpl_cloudsearch_index_top($recwords, $searchparams, $srchotquery);
}
public function viewthread_postbottom_output() {
if(!$this->allow_thread_related) {
return;
}
global $_G;
$return = array();
if($GLOBALS['page'] == 1 && $_G['forum_firstpid'] && $GLOBALS['postlist'][$_G['forum_firstpid']]['invisible'] == 0) {
$return[] = tpl_cloudsearch_viewthread_postbottom_output();
return $return;
}
}
public function collection_viewoptions_output() {
if(!$this->allow) {
return;
}
global $_G;
if($GLOBALS['permission'] || $GLOBALS['isteamworkers']) {
return tpl_cloudsearch_collection_viewoptions_output();
}
}
public function collection_relatedop_output() {
if(!$this->allow || $GLOBALS['op'] != 'related') {
return;
}
global $_G;
if(!$GLOBALS['permission'] && !$GLOBALS['isteamworkers']) {
showmessage('undefined_action', NULL);
}
$_GET['keyword'] = trim($_GET['keyword']);
$gKeyword = $_GET['keyword'] ? $_GET['keyword'] : $_G['collection']['name'];
$tids = array();
$searchHelper = Cloud::loadClass('Service_SearchHelper');
$cloudData = $searchHelper->getRelatedThreadsTao($gKeyword, $_G['page'], $_G['tpp']);
if($cloudData['result']['data']) {
foreach ($cloudData['result']['ad']['content'] as $sAdv) {
$threadlist[] = array('icon' => (string)$cloudData['result']['ad']['icon']) + $sAdv;
}
foreach ($cloudData['result']['data'] as $sPost) {
$threadlist[] = $sPost;
}
loadcache('forums');
foreach($threadlist as $curtid=>&$curvalue) {
$curvalue['pForumName'] = $_G['cache']['forums'][$curvalue['pForumId']]['name'];
$curvalue['istoday'] = strtotime($curvalue['pPosted']) > $todaytime ? 1 : 0;
$curvalue['dateline'] = $curvalue['pPosted'];
}
$multipage = multi($cloudData['result']['total'], $_G['tpp'], $_G['page'], "forum.php?mod=collection&action=view&op=related&ctid={$_G['collection']['ctid']}&keyword=".urlencode($_GET['keyword']));
}
return tpl_cloudsearch_collection_relatedop_output($threadlist, $multipage);
}
public function collection_threadlistbottom_output() {
if(!$this->allow_collection_related || !$GLOBALS['ctid'] || $GLOBALS['action'] != 'view' || $GLOBALS['op']) {
return;
}
global $_G;
return tpl_cloudsearch_relate_threadlist_output(urlencode($_G['collection']['name'].' '.implode(' ', $_G['collection']['arraykeyword'])));
}
public function forumdisplay_threadlist_bottom_output() {
global $_G;
if(!$this->allow_forum_related|| $_G['page'] > 1) {
return;
}
return tpl_cloudsearch_relate_threadlist_output(urlencode($_G['forum']['name']));
}
public function forumdisplay_middle_output() {
if(!$this->allow || !$this->allow_forum_recommend) {
return;
}
global $_G, $searchparams;
$result = '';
if ($_G['fid']) {
$searchHelper = Cloud::loadClass('Service_SearchHelper');
$recwords = $searchHelper->getRecWords(14, 'assoc', $_G['fid']);
$srchotquery = '';
if(!empty($searchparams['params'])) {
foreach($searchparams['params'] as $key => $value) {
$srchotquery .= '&' . $key . '=' . rawurlencode($value);
}
}
$result = tpl_cloudsearch_index_top($recwords, $searchparams, $srchotquery, 'hotopic_fm');
}
return $result;
}
public function viewthread_middle_output() {
if (!$this->allow || !$this->allow_thread_related_bottom) {
return;
}
global $_G;
if ($_G['page'] == 1) {
return;
}
return tpl_cloudsearch_viewthread_modaction_output();
}
public function index_forum_extra_output() {
return array();
}
public function forumdisplay_subforum_extra_output() {
return array();
}
private function _get_forum_hotspot($forumlist) {
if (!$this->allow || !$this->allow_forum_recommend) {
return;
}
global $_G, $searchparams;
if (!is_array($forumlist) || count($forumlist) == 0 || !$searchparams) {
return;
}
$srchotquery = '';
if(!empty($searchparams['params'])) {
foreach($searchparams['params'] as $key => $value) {
$srchotquery .= '&' . $key . '=' . rawurlencode($value);
}
}
$return = $cachenames = $fids = array();
foreach ($forumlist as $fid => $forum) {
$cachenames[] = 'search_recommend_words_' . $forum['fid'];
$fids[] = $forum['fid'];
}
loadcache($cachenames);
foreach ($fids as $v) {
$forum_recwords = $_G['cache']['search_recommend_words_' . $v]['result'];
if (!$forum_recwords) {
continue;
}
$forum_recwords = array_slice($forum_recwords, 0, 3);
foreach($forum_recwords as $key => $word) {
$forum_recwords[$key]['url'] = $searchparams['url'] . '?' . $srchotquery . '&q=' . urlencode($word['word']) . '&source=word.hotopic_if.'.($key + 1).'&keywordType=recommend&hwfId=' . $v;
}
$return[$v] = tpl_index_forum_extra_output($forum_recwords);
}
return $return;
}
}
class plugin_cloudsearch_group extends plugin_cloudsearch {
}
class plugin_cloudsearch_home extends plugin_cloudsearch {
}