/**
  * Show the special page
  *
  * @param $par Mixed: parameter passed to the page or null
  */
 public function execute($par)
 {
     global $wgUploadPath, $wgUser, $wgHuijiPrefix;
     $templateParser = new TemplateParser(__DIR__ . '/pages');
     $out = $this->getOutput();
     $user = $this->getUser();
     if (!$user->isAllowed('AdminDashboard')) {
         $out->permissionRequired('AdminDashboard');
         return;
     }
     // Set the page title, robot policies, etc.
     $this->setHeaders();
     // Add CSS
     $out->addModules('ext.socialprofile.userprofile.css');
     $out->addModules('ext.socialprofile.admindashboard.css');
     // Add js and message
     // $out->addModules( 'skin.bootstrapmediawiki.huiji.getRecordsInterface.js' );
     $out->addModules('ext.socialprofile.admindashboard.js');
     $out->addModules('ext.socialprofile.userprofile.js');
     $output = '';
     // Prevent E_NOTICE
     $yesterday = date("Y-m-d", strtotime("-1 day"));
     $totaledit = SiteStats::edits();
     $ueb = new UserEditBox();
     $rankInfo = AllSitesInfo::getAllSitesRankData($wgHuijiPrefix, $yesterday);
     $usf = new UserSiteFollow();
     $follows = $usf->getSiteFollowers('', $wgHuijiPrefix);
     // print_r($follows);
     $followCount = count($follows);
     if ($followCount >= 8) {
         $follows = array_slice($follows, 0, 8);
         $display = '';
     } else {
         $display = 'none';
     }
     $newFollow = array();
     foreach ($follows as $value) {
         $arr['user_name'] = $value['user_name'];
         $userPage = Title::makeTitle(NS_USER, $value['user_name']);
         $arr['user_url'] = htmlspecialchars($userPage->getFullURL());
         $arr['follow_date'] = wfMessage('comments-time-ago', HuijiFunctions::getTimeAgo(strtotime($value['follow_date'])))->text();
         $newFollow[] = $arr;
     }
     $sentToAll = SpecialPage::getTitleFor('SendToFollowers')->getFullURL();
     $showMore = SpecialPage::getTitleFor('EditRank')->getFullURL();
     $rightsManage = SpecialPage::getTitleFor('用户权限')->getFullURL();
     $blockUsers = SpecialPage::getTitleFor('封禁')->getFullURL();
     $freezeUsers = SpecialPage::getTitleFor('解除封禁')->getFullURL();
     $replaceText = SpecialPage::getTitleFor('替换文本')->getFullURL();
     $siteRankPage = SpecialPage::getTitleFor('SiteRank')->getFullURL();
     $allSpecial = SpecialPage::getTitleFor('特殊页面')->getFullURL();
     $siteAvatar = (new wSiteAvatar($wgHuijiPrefix, 'l'))->getAvatarHtml();
     $token = $user->getEditToken();
     if (is_null($newFollow)) {
         $newFollow = false;
     }
     $output .= $templateParser->processTemplate('admin_index', array('siteRank' => isset($rankInfo[0]['site_rank']) ? $rankInfo[0]['site_rank'] : '暂无', 'siteScore' => isset($rankInfo[0]['site_score']) ? $rankInfo[0]['site_score'] : '暂无', 'yesterdayCount' => UserSiteFollow::getFollowerCountOneday($wgHuijiPrefix, $yesterday), 'totalCount' => UserSiteFollow::getFollowerCount($wgHuijiPrefix), 'yesterdayEdit' => $ueb->getSiteEditCount('', $wgHuijiPrefix, $yesterday, $yesterday), 'totalEdit' => $totaledit, 'totalView' => $ueb->getSiteViewCount(-1, $wgHuijiPrefix, '', ''), 'yesterdayView' => $ueb->getSiteViewCount(-1, $wgHuijiPrefix, $yesterday, $yesterday), 'newFollow' => $newFollow, 'sendToAll' => $sentToAll, 'showMore' => $showMore, 'display' => $display, 'rightsManage' => $rightsManage, 'blockUsers' => $blockUsers, 'freezeUsers' => $freezeUsers, 'replaceText' => $replaceText, 'siteRankPage' => $siteRankPage, 'allSpecial' => $allSpecial, 'siteAvatar' => $siteAvatar, 'token' => $token));
     $out->addHtml($output);
 }
 /**
  * Show the special page
  *
  * @param $par Mixed: parameter passed to the page or null
  */
 public function execute($par)
 {
     global $wgUploadPath, $wgUser, $wgHuijiPrefix;
     $templateParser = new TemplateParser(__DIR__ . '/pages');
     $out = $this->getOutput();
     $user = $this->getUser();
     // Set the page title, robot policies, etc.
     $this->setHeaders();
     // Add Less
     $out->addModuleStyles('ext.socialprofile.admindashboard.less');
     // Add CSS
     $out->addModuleStyles('ext.socialprofile.admindashboard.css');
     // Add js and messages
     $out->addModules('ext.socialprofile.admindashboard.js');
     $output = '';
     // Prevent E_NOTICE
     $yesterday = date("Y-m-d", strtotime("-1 day"));
     $dbr = wfGetDB(DB_SLAVE);
     $counter = new SiteStatsInit($dbr);
     $totaledit = $counter->edits();
     $ueb = new UserEditBox();
     $output .= $templateParser->processTemplate('admin_index', array('yesterdayCount' => UserSiteFollow::getSiteCountOnedayDB($wgHuijiPrefix, $yesterday), 'totalCount' => UserSiteFollow::getSiteCount($wgHuijiPrefix), 'yesterdayEdit' => $ueb->getSiteEditCountOneday($wgHuijiPrefix, $yesterday), 'totalEdit' => $totaledit, 'totalView' => $ueb->getSiteViewCountTotal($wgHuijiPrefix), 'yesterdayView' => $ueb->getSiteViewCountOneday($wgHuijiPrefix, $yesterday)));
     $out->addHtml($output);
 }
    function view()
    {
        global $wgOut, $wgUser, $wgHuijiprefix, $wgOnlineStatusBarDefaultOffline, $wgOnlineStatusBarDefaultOnline;
        $wgOut->setPageTitle($this->mTitle->getPrefixedText());
        // No need to display noarticletext, we use our own message
        if (!$this->user_id) {
            parent::view();
            return '';
        }
        $staff = '';
        $bureaucrat = '';
        $sysop = '';
        $rollback = '';
        $autoconfirmed = '';
        if (in_array('staff', $this->user->getEffectiveGroups(true))) {
            $staff = '<li>职员</li> ';
        }
        if (in_array('bot', $this->user->getEffectiveGroups(true))) {
            $staff = '<li>机器人</li> ';
        }
        if (in_array('bureaucrat', $this->user->getEffectiveGroups(true))) {
            $bureaucrat = '<li>行政员</li> ';
        }
        if (in_array('sysop', $this->user->getEffectiveGroups(true))) {
            $sysop = '<li>管理员</li> ';
        }
        if (in_array('rollback', $this->user->getEffectiveGroups(true))) {
            $rollback = '<li>回退员</li> ';
        }
        if (in_array('autoconfirmed', $this->user->getEffectiveGroups(true))) {
            $autoconfirmed = '<li>自动确认用户</li> ';
        }
        $usf = new UserSiteFollow();
        $uuf = new UserUserFollow();
        $topFollowedSites = $usf->getTopFollowedSitesWithDetails($wgUser->getId(), $this->user_id);
        // $temp = array();
        // $res = array();
        // foreach( $topFollowedSites as $value ){
        // 	// if ( $wgUser->isLoggedIn() ) {
        // 	$user = User::newFromName( $this->user_name );
        // 	// }
        // 	$temp['url'] = HuijiPrefix::prefixToUrl($value);
        // 	$temp['name'] = HuijiPrefix::prefixToSiteName($value);
        // 	$temp['count'] = UserStats::getSiteEditsCount($user,$value);
        // 	$res[] = $temp;
        // }
        //sort by edit num
        $count = array();
        foreach ($topFollowedSites as $val) {
            $count[] = $val['count'];
        }
        array_multisort($count, SORT_DESC, $topFollowedSites);
        $userCount = UserSiteFollow::getFollowingCount($this->user);
        if ($this->isOwner()) {
            $target = SpecialPage::getTitleFor('ViewFollows');
            $query = array('user' => $this->user_name, 'rel_type' => 1);
            $button1 = '<li class="mw-ui-button">' . Linker::LinkKnown($target, '<i class="fa fa-users"></i>朋友', array(), $query) . '</li> ';
        } elseif ($uuf->checkUserUserFollow($wgUser, $this->user)) {
            $button1 = '<li id="user-user-follow" class="unfollow mw-ui-button"><a><i class="fa fa-minus-square-o"></i>取关</a></li> ';
        } else {
            $button1 = '<li id="user-user-follow" class="mw-ui-button"><i class="fa fa-plus-square-o"></i></i>关注</li> ';
        }
        if ($this->isOwner()) {
            $target = SpecialPage::getTitleFor('ViewGifts');
            $query = array('user' => $this->user_name);
            $button2 = '<li class="mw-ui-button">' . Linker::LinkKnown($target, '<i class="fa fa-gift"></i>礼物</a>', array(), $query) . '</li> ';
        } else {
            $target = SpecialPage::getTitleFor('GiveGift');
            $query = array('user' => $this->user_name);
            $button2 = '<li class="mw-ui-button">' . Linker::LinkKnown($target, '<i class="fa fa-gift"></i>赠送</a>', array(), $query) . '</li> ';
        }
        $contributions = SpecialPage::getTitleFor('Contributions');
        $watchlist = SpecialPage::getTitleFor('Watchlist');
        $send_message = SpecialPage::getTitleFor('UserBoard');
        $user_safe = urlencode($this->user);
        $tools = array();
        if ($wgUser->isLoggedIn()) {
            if (!$this->isOwner()) {
                $tools[] = '<li><a href="' . htmlspecialchars($send_message->getFullURL('user='******'&conv=' . $user_safe)) . '" rel="nofollow">' . wfMessage('user-send-message')->escaped() . '</a></li>';
                if ($wgUser->isAllowed('block')) {
                    # Block / Change block / Unblock links
                    if ($this->user->isBlocked() && $this->user->getBlock()->getType() != Block::TYPE_AUTO) {
                        $tools[] = '<li>' . Linker::linkKnown(SpecialPage::getTitleFor('Block', $this->user_name), wfMessage('change-blocklink')->escaped()) . '</li>';
                        $tools[] = '<li>' . Linker::linkKnown(SpecialPage::getTitleFor('Unblock', $this->user_name), wfMessage('unblocklink')->escaped()) . '</li>';
                    } else {
                        $tools[] = '<li>' . Linker::linkKnown(SpecialPage::getTitleFor('Block', $this->user_name), wfMessage('blocklink')->escaped()) . '</li>';
                    }
                }
                # Block log link
                $tools[] = '<li>' . Linker::linkKnown(SpecialPage::getTitleFor('Log', 'block'), wfMessage('sp-contributions-blocklog'), array(), array('page' => $this->mTitle->getPrefixedText())) . '</li>';
                # Suppression log link
                if ($wgUser->isAllowed('suppressionlog')) {
                    $tools[] = '<li>' . Linker::linkKnown(SpecialPage::getTitleFor('Log', 'suppress'), wfMessage('sp-contributions-suppresslog')->escaped(), array(), array('offender' => $this->user_name)) . '</li>';
                }
            }
            # Uploads
            $tools[] = '<li>' . Linker::linkKnown(SpecialPage::getTitleFor('Listfiles', $this->user_name), wfMessage('sp-contributions-uploads')->escaped()) . '</li>';
            # Other logs link
            $tools[] = '<li>' . Linker::linkKnown(SpecialPage::getTitleFor('Log', $this->user_name), wfMessage('sp-contributions-logs')->escaped()) . '</li>';
            # Add link to deleted user contributions for priviledged users
            if ($wgUser->isAllowed('deletedhistory')) {
                $tools[] = '<li>' . Linker::linkKnown(SpecialPage::getTitleFor('DeletedContributions', $this->user_name), wfMessage('sp-contributions-deleted')->escaped()) . '</li>';
            }
            # Add a link to change user rights for privileged users
            $userrightsPage = new UserrightsPage();
            $userrightsPage->setContext($this->getContext());
            if ($userrightsPage->userCanChangeRights($this->user)) {
                $tools[] = '<li>' . Linker::linkKnown(SpecialPage::getTitleFor('Userrights', $this->user_name), wfMessage('sp-contributions-userrights')->escaped()) . '</li>';
            }
            if ($this->isOwner()) {
                $tools[] = '<li><a href="' . htmlspecialchars($watchlist->getFullURL()) . '">' . wfMessage('user-watchlist')->escaped() . '</a></li>';
            }
        }
        //user isonline
        // $_SESSION['username'] = $wgUser->getName();
        // $user = User::newFromName( $this->user_name );
        // $isonline = OnlineStatusBar_StatusCheck::getStatus( $user );
        // if($isonline === 'online'){
        // 	$online = '在线';
        // }else{
        // 	$online = '未知';
        // }
        // $wgOut->addModuleScripts( 'ext.socialprofile.useruserfollows.js' ); #this script is already added globally
        // $wgOut->addHTML($wgAjaxExportList); # What is that for??
        $wgOut->addHTML('<div class="profile-page"><div id="profile-top" class="jumbotron row">');
        $wgOut->addHTML($this->getProfileTop($this->user_id, $this->user_name));
        $wgOut->addHTML('
            
            <div class="col-md-6 col-sm-12 col-xs-12 profile-top-right">
                <div class="profile-top-right-top">
                    <div><h4><span class="icon-huiji"></span>在本wiki</h4></div>
                    <ul>' . $staff . $bureaucrat . $sysop . $rollback . $autoconfirmed . '</ul>
                </div>
                <div class="profile-top-right-bottom">
                    <ul>');
        foreach ($topFollowedSites as $value) {
            $Turl[] = HuijiPrefix::prefixToUrl($value['key']);
            $Tname[] = $value['val'];
            $Tcount[] = $value['count'];
        }
        if (isset($Tname)) {
            $num = count($Tname) > 3 ? 3 : count($Tname);
            for ($i = 0; $i < $num; $i++) {
                $wgOut->addHTML('<li><a href="' . $Turl[$i] . '">' . $Tname[$i] . '</a></li>');
            }
        }
        $wgOut->addHTML(' </ul>

        ');
        if ($this->isOwner()) {
            $wgOut->addHTML('<a >查看我关注的<i id="site-following-count">' . $userCount . '</i>个wiki</a>');
        } else {
            $wgOut->addHTML('<a >关注了<i>' . $userCount . '</i>个wiki</a>');
        }
        $wgOut->addHTML('
                    <div>
                        <ul class="profile-interactive">' . $button1 . $button2 . '<li class="dropdown-toggle mw-ui-button" data-toggle="dropdown" aria-expanded="false"><span class="glyphicon glyphicon-align-justify"></span></li>
                            <ul class="dropdown-menu" role="menu">
                                        ' . implode('', $tools) . ' 
                                        <li><a href="' . htmlspecialchars($contributions->getFullURL('target=' . $user_safe . '&contribs=user')) . '" rel="nofollow">' . wfMessage('user-contributions')->escaped() . '</a></li>
                            </ul>
                        </ul>
                    </div>
                </div>
            </div>
        ');
        $wgOut->addHTML('<div class="cleared"></div></div>');
        // // User does not want social profile for User:user_name, so we just
        // // show header + page content
        // if (
        // 	$this->getTitle()->getNamespace() == NS_USER &&
        // 	$this->profile_data['user_id'] &&
        // 	$this->profile_data['user_page_type'] == 0
        // )
        // {
        // 	parent::view();
        // 	return '';
        // }
        $ueb = new UserEditBox();
        $editBox = $editData = array();
        $userEditInfo = $ueb->getUserEditInfo($this->user_id);
        $maxlen = $currentMaxlen = 0;
        //init variables.
        if ($userEditInfo != false) {
            $wgOut->addHTML('<div id="user-page-center" class="col-md-12 hidden-xs">
        	<div class="panel panel-default"><div class="user-section-heading panel-heading">
 			<div class="user-section-title">贡献</div>
 			<div class="action-right"></div>
			<div class="cleared"></div></div><div class="user-gift-container panel-body check-body">');
            foreach ($userEditInfo as $value) {
                if (is_object($value) && !empty($value->_id) && $value->value > 0) {
                    $editBox[$value->_id] = $value->value;
                    $editData[] = $value->_id;
                    //echo $value->_id.'->'.$value->value.'<br>';
                }
            }
            $today = date("Y-m-d");
            $yesterday = date("Y-m-d", strtotime("-1 day"));
            $editBox[$today] = UserEditBox::getTodayEdit($this->user_id);
            if (!empty($editBox[$today])) {
                $editData[] = $today;
            }
            $totalEdit = count($editData);
            if ($totalEdit > 0) {
                $resArr[] = strtotime($editData[0]);
                $maxlen = 1;
            }
            for ($k = 1; $k < count($editData); $k++) {
                if (in_array(strtotime($editData[$k]) - 86400, $resArr)) {
                    $resArr[] = strtotime($editData[$k]);
                    if (count($resArr) > $maxlen) {
                        $maxlen = count($resArr);
                    }
                } else {
                    $resArr = array();
                    $resArr[] = strtotime($editData[$k]);
                }
                if ($resArr[count($resArr) - 1] == strtotime($today) || $resArr[count($resArr) - 1] == strtotime($yesterday)) {
                    $currentMaxlen = count($resArr);
                } else {
                    $currentMaxlen = 0;
                }
            }
            $usg = new UserSystemGifts($this->user->getName());
            if ($maxlen == 2) {
                $usg->sendSystemGift(33);
            } elseif ($maxlen == 3) {
                $usg->sendSystemGift(34);
            } elseif ($maxlen == 7) {
                $usg->sendSystemGift(35);
            } elseif ($maxlen == 13) {
                $usg->sendSystemGift(36);
            } elseif ($maxlen == 23) {
                $usg->sendSystemGift(37);
            } elseif ($maxlen == 61) {
                $usg->sendSystemGift(38);
            } elseif ($maxlen == 109) {
                $usg->sendSystemGift(39);
            } elseif ($maxlen == 199) {
                $usg->sendSystemGift(40);
            } elseif ($maxlen == 367) {
                $usg->sendSystemGift(41);
            } elseif ($maxlen == 727) {
                $usg->sendSystemGift(42);
            } elseif ($maxlen == 1213) {
                $usg->sendSystemGift(43);
            } elseif ($maxlen == 1579) {
                $usg->sendSystemGift(44);
            } elseif ($maxlen == 1949) {
                $usg->sendSystemGift(45);
            } elseif ($maxlen == 2333) {
                $usg->sendSystemGift(46);
            }
            $wgOut->addHTML('
	            <div class="check-wrapper"><svg width="725" height="110" class=" ">
	                <g transform="translate(20, 20)">
	        ');
            $n = 676 / 13;
            $dateArr = array();
            for ($k = 0; $k < 365; $k++) {
                $dateArr[] = date('Y-m-d', strtotime("-{$k} day"));
            }
            $desdateArr = array_reverse($dateArr);
            $translate = array();
            for ($i = 0; $i <= $n; $i++) {
                $trani = $i * 13;
                $wgOut->addHTML('
	                <g transform="translate(' . $trani . ', 0)">');
                $dayofweek = date('w', strtotime($desdateArr[0]));
                if ($i == 0) {
                    $j = $dayofweek;
                    $start = 0;
                    $m = 7 - $dayofweek;
                } else {
                    $j = 0;
                    $m = 7;
                    $start = $i * 7 - $dayofweek;
                }
                $zoneDate = array_slice($desdateArr, $start, $m);
                foreach ($zoneDate as $val) {
                    $arrDate[$j] = $val;
                    $y = $j * 13;
                    $dataCount = isset($editBox[$val]) ? $editBox[$val] : 0;
                    if ($dataCount == 0) {
                        $color = '#eee';
                    } elseif ($dataCount > 0 && $dataCount <= 8) {
                        $color = '#86beee';
                    } elseif ($dataCount > 8 && $dataCount <= 21) {
                        $color = '#5ea2de';
                    } elseif ($dataCount > 21 && $dataCount <= 55) {
                        $color = '#256fb1';
                    } else {
                        $color = '#0d5493';
                    }
                    $wgOut->addHTML('<rect class="day" width="11" height="11" y="' . $y . '" fill="' . $color . '" data-count="' . $dataCount . '" data-date="' . $val . '" title="' . $val . ' 编辑' . $dataCount . '次"></rect>');
                    $j = $j >= 7 ? 0 : $j + 1;
                }
                if (!empty($arrDate[0])) {
                    $translate[$arrDate[0]] = $trani;
                }
                $wgOut->addHTML('</g>');
            }
            $moninit = 1;
            for ($p = 0; $p < 12; $p++) {
                $year = date('Y') - 1;
                $mon = date('m') + $p + 1;
                if ($mon > 12) {
                    $mon = $moninit++;
                    $year = date('Y');
                }
                $sunDay = UserEditBox::getSunday($mon, $year);
                $Stime = strtotime($sunDay);
                $sunDay = date('Y-m-d', $Stime);
                if (!isset($translate[$sunDay])) {
                    $Suntime = strtotime($sunDay);
                    $Sundate = date('Y', $Suntime) - 1;
                    $sunDay = UserEditBox::getSunday($mon, $Sundate);
                }
                foreach ($translate as $key => $value) {
                    if (strtotime($key) == strtotime($sunDay)) {
                        $x = $value;
                    }
                }
                $wgOut->addHTML('<text x="' . $x . '" y="-5" class="' . $year . '">' . $mon . '月</text>');
            }
            $wgOut->addHTML('
						<text text-anchor="middle" class="wday" dx="-10" dy="9" style="display: none;">S</text>
			            <text text-anchor="middle" class="wday" dx="-10" dy="22">M</text>
			            <text text-anchor="middle" class="wday" dx="-10" dy="35" style="display: none;">T</text>
			            <text text-anchor="middle" class="wday" dx="-10" dy="48">W</text>
			            <text text-anchor="middle" class="wday" dx="-10" dy="61" style="display: none;">T</text>
			            <text text-anchor="middle" class="wday" dx="-10" dy="74">F</text>
			            <text text-anchor="middle" class="wday" dx="-10" dy="87" style="display: none;">S</text>
			          </g>
			        </svg>
			        <div class="legend-intro">
			        <span><b>编辑数</b> 低</span>
			        <ul class="legend">
			            <li style="background-color: #eee"></li>
			            <li style="background-color: #86beee"></li>
			            <li style="background-color: #5ea2de"></li>
			            <li style="background-color: #256fb1"></li>
			            <li style="background-color: #0d5493"></li>
		            </ul>
		            <span>高</span>
		            </div>
		            <div class="edit-statistics"><p>连续编辑纪录<span>' . $maxlen . '</span></p><p>总编辑天数<span>' . $totalEdit . '</span></p><p>当前连续编辑<span>' . $currentMaxlen . '<span></p></div>
	        	</div>');
            $wgOut->addHTML('</div></div></div>');
        }
        // Left side
        $wgOut->addHTML('<div id="user-page-left" class="col-md-6">');
        if (!wfRunHooks('UserProfileBeginLeft', array(&$this))) {
            wfDebug(__METHOD__ . ": UserProfileBeginLeft messed up profile!\n");
        }
        if ($this->user_id != $wgUser->getId()) {
            $wgOut->addHTML($this->getCommonInterest($wgUser->getId(), $this->user_id));
        }
        $wgOut->addHTML($this->getRelationships($this->user_name, 1));
        $wgOut->addHTML($this->getRelationships($this->user_name, 2));
        $wgOut->addHTML($this->getGifts($this->user_name));
        $wgOut->addHTML($this->getCustomInfo($this->user_name));
        $wgOut->addHTML($this->getInterests($this->user_name));
        $wgOut->addHTML($this->getFanBoxes($this->user_name));
        $wgOut->addHTML($this->getUserStats($this->user_id, $this->user_name));
        $wgOut->addHTML($this->getEditingActivity($this->user_name));
        $wgOut->addHTML($this->getNonEditingActivity($this->user_name));
        if (!wfRunHooks('UserProfileEndLeft', array(&$this))) {
            wfDebug(__METHOD__ . ": UserProfileEndLeft messed up profile!\n");
        }
        $wgOut->addHTML('</div>');
        wfDebug("profile start right\n");
        // Right side
        $wgOut->addHTML('<div id="user-page-right" class="col-md-6">');
        if (!wfRunHooks('UserProfileBeginRight', array(&$this))) {
            wfDebug(__METHOD__ . ": UserProfileBeginRight messed up profile!\n");
        }
        $wgOut->addHTML($this->getAwards($this->user_name));
        $wgOut->addHTML($this->getPersonalInfo($this->user_id, $this->user_name));
        // Hook for BlogPage
        if (!wfRunHooks('UserProfileRightSideAfterActivity', array($this))) {
            wfDebug(__METHOD__ . ": UserProfileRightSideAfterActivity hook messed up profile!\n");
        }
        $wgOut->addHTML($this->getCasualGames($this->user_id, $this->user_name));
        $wgOut->addHTML($this->getUserBoard($this->user_id, $this->user_name));
        if (!wfRunHooks('UserProfileEndRight', array(&$this))) {
            wfDebug(__METHOD__ . ": UserProfileEndRight messed up profile!\n");
        }
        $wgOut->addHTML('</div><div class="cleared"></div></div>');
    }
 static function getAllSitesRank()
 {
     $allSite = HuijiPrefix::getAllPrefix();
     $today = date('Y-m-d');
     $yesterday = date('Y-m-d', strtotime('-1 days'));
     $lastWeek = date('Y-m-d', strtotime('-8 days'));
     $lastMonth = date('Y-m-d', strtotime('-31 days'));
     $ueb = new UserEditBox();
     $editUserYesterday = $ueb->getSiteEditUserCount($yesterday, $yesterday);
     $editUserWeek = $ueb->getSiteEditUserCount($lastWeek, $yesterday);
     $editUserMonth = $ueb->getSiteEditUserCount($lastMonth, $yesterday);
     // print_r($editUserYesterday);
     $viewDate = array();
     $editDate = array();
     $editUserDate = array();
     foreach ($allSite as $value) {
         $viewResult['yesterday'] = $ueb->getSiteViewCount('', $value, $yesterday, $yesterday);
         $viewResult['week'] = $ueb->getSiteViewCount('', $value, $lastWeek, $yesterday);
         $viewResult['month'] = $ueb->getSiteViewCount('', $value, $lastMonth, $yesterday);
         $editResult['yesterday'] = $ueb->getSiteEditCount('', $value, $yesterday, $yesterday);
         $editResult['week'] = $ueb->getSiteEditCount('', $value, $lastWeek, $yesterday);
         $editResult['month'] = $ueb->getSiteEditCount('', $value, $lastMonth, $yesterday);
         $viewDate[$value] = round($viewResult['yesterday'] + $viewResult['week'] / 7 + $viewResult['month'] / 30);
         $editDate[$value] = round($editResult['yesterday'] + $editResult['week'] / 7 + $editResult['month'] / 30);
         $editUserDate[$value] = round(isset($editUserYesterday[$value]) ? $editUserYesterday[$value] : 0 + (isset($editUserWeek[$value]) ? $editUserWeek[$value] : 0) / 7 + (isset($editUserMonth[$value]) ? $editUserMonth[$value] : 0) / 30);
     }
     //sort arr
     asort($viewDate);
     asort($editDate);
     asort($editUserDate);
     // print_r($editUserDate);
     $i = 1;
     //loop score
     $viewRes = array();
     $editRes = array();
     $editUserRes = array();
     foreach ($viewDate as $key => $value) {
         $viewRes[$key] = $i * 10;
         $i++;
     }
     $j = 1;
     foreach ($editDate as $key => $value) {
         $editRes[$key] = $j * 10;
         $j++;
     }
     $k = 1;
     foreach ($editUserDate as $key => $value) {
         $editUserRes[$key] = $k * 10;
         $k++;
     }
     //highest score
     $highest = ($k - 1) * 100;
     //Comprehensive 2 4 4
     $allRank = array();
     foreach ($viewRes as $key => $value) {
         $allRank[$key] = $value * 2 + $editRes[$key] * 4 + $editUserRes[$key] * 4;
     }
     arsort($allRank);
     $x = 1;
     // print_r($allRank);
     //final rank
     foreach ($allRank as $key => $value) {
         $rank = $x;
         $score = round(100 * $value / $highest, 2);
         // $numRank['rank'] = $x;
         // $numRank['score'] = round(100*$value/$highest, 2);
         // $res[$key] = $numRank;
         //insert
         $dbw = wfGetDB(DB_MASTER);
         $dbw->insert('site_rank', array('site_rank' => $rank, 'site_score' => $score, 'site_prefix' => $key, 'site_rank_date' => $yesterday), __METHOD__);
         //best rank
         $key_rank = AllSitesInfo::getSiteBestRank($key);
         $site_rank = !is_null($key_rank) ? $key_rank : 1000;
         if ($rank < $site_rank) {
             $dbw = wfGetDB(DB_MASTER);
             $dbw->upsert('site_best_rank', array('site_rank' => $rank, 'site_prefix' => $key), array('site_prefix' => $key), array('site_rank' => $rank), __METHOD__);
         }
         $x++;
     }
 }
 static function showPage()
 {
     global $wgUser, $wgParser;
     $templateParser = new TemplateParser(__DIR__ . '/View');
     $output = '';
     // Prevent E_NOTICE
     //user login
     if ($wgUser->isLoggedIn()) {
         $login = true;
     } else {
         $login = false;
         $register = Linker::linkKnown(SpecialPage::getTitleFor('Userlogin'), '注册', array(), array('type' => 'signup'));
         $active = 'active';
         $inactive = 'in active';
     }
     // check mobile device
     $mobile = mobiledetect();
     $mobileUser = $mobile && $login;
     if (!$mobileUser) {
         //right data
         $fileCount = AllSitesInfo::getAllUploadFileCount();
         $siteCount = AllSitesInfo::getSiteCountNum();
         $userCount = AllSitesInfo::getUsreCountNum();
         $editCount = AllSitesInfo::getAllSiteEditCount();
         $pageCount = AllSitesInfo::getAllPageCount();
         $userName = $wgUser->getName();
         $usreId = $wgUser->getId();
         $avatar = new wAvatar($usreId, 'l');
         $userAvatar = $avatar->getAvatarURL();
         //level
         $stats = new UserStats($usreId, $userName);
         $stats_data = $stats->getUserStats();
         $user_level = new UserLevel($stats_data['points']);
         $level_link = Title::makeTitle(NS_HELP, wfMessage('user-profile-userlevels-link')->inContentLanguage()->text());
         $levelUrl = htmlspecialchars($level_link->getFullURL());
         $userLevel = $user_level->getLevelName();
         //user info
         $notice = SpecialPage::getTitleFor('ViewFollows');
         $contributions = SpecialPage::getTitleFor('Contributions');
         $userEdit = Linker::link($contributions, $stats_data['edits'], array(), array('target' => $userName, 'contribs' => 'user'));
         $follower = Linker::link($notice, UserUserFollow::getFollowingCount($wgUser), array('id' => 'user-following-count'), array('user' => $userName, 'rel_type' => 1));
         $followee = Linker::link($notice, UserUserFollow::getFollowerCount($wgUser), array('id' => 'user-follower-count'), array('user' => $userName, 'rel_type' => 2));
         //siterank
         $yesterday = date('Y-m-d', strtotime('-1 days'));
         $allSiteRank = AllSitesInfo::getAllSitesRankData('', $yesterday);
         $siteRank = array_slice($allSiteRank, 0, 10);
         $siteInfo = array();
         foreach ($siteRank as $key => $value) {
             $siteRank[$key]['site_prefix'] = HuijiPrefix::prefixToSiteName($value['site_prefix']);
             $siteRank[$key]['site_url'] = HuijiPrefix::prefixToUrl($value['site_prefix']);
             $siteInfo = AllSitesInfo::getPageInfoByPrefix($value['site_prefix']);
             $siteRank[$key]['totalEdits'] = $siteInfo['totalEdits'];
             $siteRank[$key]['totalArticles'] = $siteInfo['totalArticles'];
             $siteRank[$key]['totalPages'] = $siteInfo['totalPages'];
             $siteRank[$key]['totalUsers'] = $siteInfo['totalUsers'];
         }
         //userrank
         $weekRank = UserStats::getUserRank(10, 'week');
         $monthRank = UserStats::getUserRank(20, 'month');
         $totalRank = UserStats::getUserRank(20, 'total');
         //小蓝格
         $ueb = new UserEditBox();
         $editBox = $editData = array();
         $userEditInfo = $ueb->getUserEditInfo($usreId);
         $maxlen = $currentMaxlen = 0;
         //init variables.
         foreach ($userEditInfo as $value) {
             if (is_object($value) && !empty($value->_id) && $value->value > 0) {
                 $editBox[$value->_id] = $value->value;
                 $editData[] = $value->_id;
             }
         }
         $today = date("Y-m-d");
         $yesterday = date("Y-m-d", strtotime("-1 day"));
         $editBox[$today] = UserEditBox::getTodayEdit($usreId);
         if (!empty($editBox[$today])) {
             $editData[] = $today;
         }
         $totalEdit = count($editData);
         if ($totalEdit > 0) {
             $resArr[] = strtotime($editData[0]);
             $maxlen = 1;
         }
         for ($k = 1; $k < count($editData); $k++) {
             if (in_array(strtotime($editData[$k]) - 86400, $resArr)) {
                 $resArr[] = strtotime($editData[$k]);
                 if (count($resArr) > $maxlen) {
                     $maxlen = count($resArr);
                 }
             } else {
                 $resArr = array();
                 $resArr[] = strtotime($editData[$k]);
             }
             if ($resArr[count($resArr) - 1] == strtotime($today) || $resArr[count($resArr) - 1] == strtotime($yesterday)) {
                 $currentMaxlen = count($resArr);
             } else {
                 $currentMaxlen = 0;
             }
         }
         $lange = '<svg width="710" height="110" class=" ">
                  <g transform="translate(20, 20)">';
         $n = 676 / 13;
         $dateArr = array();
         for ($k = 0; $k < 365; $k++) {
             $dateArr[] = date('Y-m-d', strtotime("-{$k} day"));
         }
         $desdateArr = array_reverse($dateArr);
         $translate = array();
         for ($i = 0; $i <= $n; $i++) {
             $trani = $i * 13;
             $lange .= '<g transform="translate(' . $trani . ', 0)">';
             $dayofweek = date('w', strtotime($desdateArr[0]));
             if ($i == 0) {
                 $j = $dayofweek;
                 $start = 0;
                 $m = 7 - $dayofweek;
             } else {
                 $j = 0;
                 $m = 7;
                 $start = $i * 7 - $dayofweek;
             }
             $zoneDate = array_slice($desdateArr, $start, $m);
             foreach ($zoneDate as $val) {
                 $arrDate[$j] = $val;
                 $y = $j * 13;
                 $dataCount = isset($editBox[$val]) ? $editBox[$val] : 0;
                 if ($dataCount == 0) {
                     $color = '#eee';
                 } elseif ($dataCount > 0 && $dataCount <= 8) {
                     $color = '#86beee';
                 } elseif ($dataCount > 8 && $dataCount <= 21) {
                     $color = '#5ea2de';
                 } elseif ($dataCount > 21 && $dataCount <= 55) {
                     $color = '#256fb1';
                 } else {
                     $color = '#0d5493';
                 }
                 $lange .= '<rect class="day" width="11" height="11" y="' . $y . '" fill="' . $color . '" data-count="' . $dataCount . '" data-date="' . $val . '" title="' . $val . ' 编辑' . $dataCount . '次"></rect>';
                 $j = $j >= 7 ? 0 : $j + 1;
             }
             if (!empty($arrDate[0])) {
                 $translate[$arrDate[0]] = $trani;
             }
             $lange .= '</g>';
         }
         $moninit = 1;
         for ($p = 0; $p < 12; $p++) {
             $year = date('Y') - 1;
             $mon = date('m') + $p + 1;
             if ($mon > 12) {
                 $mon = $moninit++;
                 $year = date('Y');
             }
             $sunDay = UserEditBox::getSunday($mon, $year);
             $Stime = strtotime($sunDay);
             $sunDay = date('Y-m-d', $Stime);
             if (!isset($translate[$sunDay])) {
                 $Suntime = strtotime($sunDay);
                 $Sundate = date('Y', $Suntime) - 1;
                 $sunDay = UserEditBox::getSunday($mon, $Sundate);
             }
             foreach ($translate as $key => $value) {
                 if (strtotime($key) == strtotime($sunDay)) {
                     $x = $value;
                 }
             }
             $lange .= '<text x="' . $x . '" y="-5" class="' . $year . '">' . $mon . '月</text>';
         }
         $lange .= ' <text text-anchor="middle" class="wday" dx="-10" dy="9" style="display: none;">S</text>
                  <text text-anchor="middle" class="wday" dx="-10" dy="22">M</text>
                  <text text-anchor="middle" class="wday" dx="-10" dy="35" style="display: none;">T</text>
                  <text text-anchor="middle" class="wday" dx="-10" dy="48">W</text>
                  <text text-anchor="middle" class="wday" dx="-10" dy="61" style="display: none;">T</text>
                  <text text-anchor="middle" class="wday" dx="-10" dy="74">F</text>
                  <text text-anchor="middle" class="wday" dx="-10" dy="87" style="display: none;">S</text>
                </g>
              </svg>';
         //url helpManual huijitramac
         $helpManual = 'http://www.huiji.wiki/wiki/%E5%B8%AE%E5%8A%A9:%E7%BC%96%E8%BE%91%E6%89%8B%E5%86%8C';
         $tarmac = 'http://www.huiji.wiki/wiki/%E7%81%B0%E6%9C%BAwiki:%E7%81%B0%E6%9C%BA%E5%81%9C%E6%9C%BA%E5%9D%AA';
         $contact = 'http://www.huiji.wiki/wiki/%E7%81%B0%E6%9C%BAwiki:%E8%81%94%E7%B3%BB%E6%88%91%E4%BB%AC';
     }
     if ($login) {
         // follow
         $followUserCount = UserUserFollow::getFollowingCount($wgUser);
         if ($followUserCount >= 5) {
             $userHidden = true;
         } else {
             $userHidden = false;
         }
         $followSiteCount = UserSiteFollow::getFollowingCount($wgUser);
         if ($followSiteCount >= 5) {
             $siteHidden = true;
         } else {
             $siteHidden = false;
         }
         //recommend user $weekRank $monthRank  $totalRank
         $uuf = new UserUserFollow();
         if (count($weekRank) >= 8) {
             $recommend = UserStats::getUserRank(10, 'week');
         } elseif (count($monthRank) >= 8) {
             $recommend = UserStats::getUserRank(20, 'month');
         } else {
             $recommend = UserStats::getUserRank(20, 'total');
         }
         $recommendRes = array();
         $flres = array();
         foreach ($recommend as $value) {
             $tuser = User::newFromName($value['user_name']);
             $isFollow = $uuf->checkUserUserFollow($wgUser, $tuser);
             if (!$isFollow && $value['user_name'] != $userName) {
                 $flres['avatar'] = $value['avatarImage'];
                 $flres['username'] = $value['user_name'];
                 $flres['userurl'] = $value['user_url'];
                 $recommendRes[] = $flres;
             }
         }
         $recommendRes = array_slice($recommendRes, 0, 5);
         //recommend site
         $usf = new UserSiteFollow();
         // $recSite = array_slice($allSiteRank,0 ,5);
         $recommendSite = array();
         foreach ($allSiteRank as $value) {
             $isFollowSite = $usf->checkUserSiteFollow($wgUser, $value['site_prefix']);
             if ($isFollowSite == false) {
                 $fsres['s_name'] = HuijiPrefix::prefixToSiteName($value['site_prefix']);
                 $fsres['s_url'] = HuijiPrefix::prefixToUrl($value['site_prefix']);
                 $fsres['s_prefix'] = $value['site_prefix'];
                 $fsres['s_avatar'] = (new wSiteAvatar($value['site_prefix'], 'l'))->getAvatarHtml();
                 $recommendSite[] = $fsres;
             }
         }
         $recommendSite = array_slice($recommendSite, 0, 5);
         if ($login && !$mobile) {
             $infoHeader = wfMessage('info-header-user')->parseAsBlock();
         } elseif (!$login) {
             $infoHeader = wfMessage('info-header-anon')->parseAsBlock();
         } else {
             $infoHeader = '';
         }
     }
     $output .= $templateParser->processTemplate('frontpage', array('mobileUser' => $mobileUser, 'infoHeader' => $infoHeader, 'fileCount' => $fileCount, 'siteCount' => $siteCount, 'userCount' => $userCount, 'editCount' => $editCount, 'pageCount' => $pageCount, 'userName' => $userName, 'userAvatar' => $userAvatar, 'levelUrl' => $levelUrl, 'userLevel' => $userLevel, 'userEdit' => $userEdit, 'follower' => $follower, 'followee' => $followee, 'siteRank' => $siteRank, 'weekRank' => $weekRank, 'monthRank' => $monthRank, 'totalRank' => $totalRank, 'lange' => $lange, 'login' => $login, 'register' => $register, 'userHidden' => $userHidden, 'siteHidden' => $siteHidden, 'active' => $active, 'inactive' => $inactive, 'recommendSite' => $recommendSite, 'recContent' => $recContent, 'followUserCount' => $followUserCount, 'followSiteCount' => $followSiteCount, 'helpManual' => $helpManual, 'tarmac' => $tarmac, 'contact' => $contact));
     return $output;
 }
 /**
  * get the site's some days view count
  * @param  sting $fromTime  '2016-01-01'
  * @param  string $toTime   '2016-02-02'
  * @return array
  */
 public function getViewCount($fromTime, $toTime)
 {
     $ueb = new UserEditBox();
     return $ueb->getSiteViewCount(-1, $this->mPrefix, $fromTime, $toTime);
 }