/**
  * Получение списка пользователей.
  *
  * @todo кеш и js
  * 
  * @param string $s        - поисковая строка
  * @param string $limit    - сколько записей запрашивать
  * @param int    $userType - фильтр результатов поиска:  0 - искать и фриленсеров и работодателей,   
  *                         1 - искать только фриленсеров,
  *                         2 - искать только работодателей,
  * @param int    $scope    - определяет, где искать:  0 - в СБР/контактах и общем списке пользователей,
  *                         1 - в СБР/контактах,
  *                         2 - в общем списке пользователей
  *
  * @return string - список пользователей в формате JSON
  */
 public function getUsersList($s, $limit = 'ALL', $userType = 0, $scope = 0)
 {
     session_start();
     $uid = get_uid(false);
     $result = array();
     $contacts = array();
     $more = array();
     // подготовка строки для поиска в shpinx
     if ($s != '') {
         $s = iconv('UTF-8', 'WINDOWS-1251//IGNORE', $s);
         $s = substr(trim($s), 0, 60);
         $r = preg_split("/\\s+/", $s);
         $s = '';
         // если введено два слова, то пологаем что это имя и фамилия и обрабатываем вариант такого поиска особо
         // если одно из слов состоит только из /^[-_a-z0-9]+$/i также полагаем что это может быть часть логина
         if (count($r) == 2) {
             $s = "(@uname {$r[0]} & (@usurname *{$r[1]}* | @usurname {$r[1]})) | (@usurname {$r[0]} & (@uname *{$r[1]}* | @uname {$r[1]}))";
             if (preg_match('/^[-_a-z0-9]+$/i', $r[0])) {
                 $s .= " | (@login *{$r[0]}* & (@uname *{$r[1]}* | @usurname *{$r[1]}*)) | @login *{$r[0]}*";
             }
             if (preg_match('/^[-_a-z0-9]+$/i', $r[1])) {
                 $s .= " | (@login *{$r[1]}* & (@uname {$r[0]} | @usurname {$r[0]})) | @login *{$r[1]}*";
             }
             // во всех остальных случаях полагаем что все слова кроме последнего введены полностью и просто ищем совпадения
         } else {
             for ($i = 0; $i < count($r) - 1; ++$i) {
                 $s .= "{$r[$i]} | ";
             }
             $s .= "*{$r[$i]}* | {$r[$i]}";
         }
     }
     // если нужны контакты в сбр и личке, то получаем их id
     if ($scope == 0 || $scope == 1) {
         // контакты в сбр
         $memBuff = new memBuff();
         $contacts = $memBuff->get("bComboUsers{$uid}");
         if ($contacts === false) {
             if (is_emp()) {
                 $sbr = new sbr_emp($uid);
             } else {
                 $sbr = new sbr_frl($uid);
             }
             $contacts = $sbr->getPartersId();
             // контакты в личке
             $mess = new messages();
             $rows = $mess->GetContacts($uid);
             for ($i = 0; $i < count($rows); ++$i) {
                 if (!in_array($rows[$i]['uid'], $contacts)) {
                     $contacts[] = $rows[$i]['uid'];
                 }
             }
             $memBuff->set("bComboUsers{$uid}", $contacts, 600);
         }
     }
     // $i = 0-контакты, 1-остальные пользователи
     for ($i = 0; $i <= 1; ++$i) {
         if (!$i && !$contacts) {
             continue;
         }
         $rows = array();
         // если поиск не требуется
         if ($s == '') {
             if (!$i) {
                 if ($userType) {
                     $table = $userType == 2 ? 'employer' : 'freelancer';
                 } else {
                     $table = 'users';
                 }
                 $rows = users::GetUsersInfoByIds($limit == 'ALL' ? $contacts : array_slice($contacts, 0, $limit), $table);
             }
             // если требуется
         } else {
             $filter = array();
             if ($contacts) {
                 if (!$i) {
                     $filter['uids'] = $contacts;
                 } else {
                     $filter['nouids'] = $contacts;
                 }
             }
             if ($userType) {
                 $filter['utype'] = $userType - 1;
             }
             $search = new search(get_uid(false));
             $search->addElement('users_simple', true);
             $search->search($s, 0, $filter, $limit == 'ALL' ? 1000 : $limit);
             $res = $search->getElements();
             $rows = $res['users_simple']->getRecords();
             $more[$i] = $res['users_simple']->total - count($rows);
         }
         // готовим вывод
         foreach ($rows as $k => $v) {
             if ($v['uid'] == null) {
                 $v['uid'] = $v['id'];
             }
             $v['uname'] = iconv('WINDOWS-1251', 'UTF-8//IGNORE', $v['uname']);
             $v['usurname'] = iconv('WINDOWS-1251', 'UTF-8//IGNORE', $v['usurname']);
             if ($v['photo']) {
                 $v['path'] = 'users/' . substr($v['login'], 0, 2) . '/' . $v['login'] . '/foto';
                 $v['photo'] = get_unanimated_gif($v['login'], $v['photo']);
             } else {
                 $v['photo'] = '/images/temp/small-pic.gif';
             }
             $v['isContacts'] = (int) (!(bool) $i);
             $result[] = $v;
         }
     }
     //return $result;
     // выводим
     $data = array('list' => $result, 'counters' => array('moreContacts' => $more[0], 'moreUsers' => $more[1]), 'dav' => WDCPREFIX);
     return json_encode($data);
 }
Beispiel #2
0
 /**
  * Возвращает родстер (список контактов) пользователя.
  * 
  * @param stdClass $attr - список параметров
  *                       string  type  : all - вернуть всех пользователей, active - вернуть только "активных".
  *                       Обязательные параметр. @see self::ACTIVE_CONTACT
  *                       integer online: 1 - возвращать только пользователей находящихся на сайте, 0 - всех
  * 
  * @return array - массив с пользователями
  */
 protected function _ceContacts($attr)
 {
     global $session;
     $messages = new messages();
     if (is_emp($this->_uid)) {
         $sbr = new sbr_emp($this->_uid);
     } else {
         $sbr = new sbr_frl($this->_uid);
     }
     $rows = array_merge($messages->GetContacts($this->_uid), $sbr->getContacts());
     $uids = array();
     $res = array();
     foreach ($rows as $row) {
         if (in_array($row['uid'], $uids) || $row['login'] == 'admin') {
             continue;
         }
         $uids[] = $row['uid'];
         if ($attr->type == 'active' && (isset($row['my_last_post']) || isset($row['his_last_post']))) {
             $last = max(strtotime($row['my_last_post']), strtotime($row['his_last_post']));
             if ($last + self::ACTIVE_CONTACT < time()) {
                 continue;
             }
         }
         $session->view_online_status($row['login']);
         $row['online'] = $session->is_active;
         if (!empty($attr->online) && !$row['online']) {
             continue;
         }
         $res[] = array('uid' => $row['uid'], 'name' => $row['uname'] ? iconv('CP1251', 'UTF-8', $row['uname'] . ' ' . $row['usurname']) : $row['login'], 'login' => $row['login'], 'online' => (int) $row['online'], 'avatar' => $row['photo'] ? WDCPREFIX . '/users/' . $row['login'] . '/foto/sm_' . $row['photo'] : '', 'emp' => (int) is_emp($row['role']), 'pro' => (int) ($row['is_pro'] == 't'));
     }
     return $res;
 }
Beispiel #3
0
/**
 * Изменение бана пользователя
 * 
 * @param  string $sUsers JSON строка с массивом UID пользователей
 * @param  int $nActId
 * @param  string $sReasonTxt причина
 * @param  int $nReasonId ID причины, если она выбрана из списка (таблица admin_reasons)
 * @param  int $nNoSend опционально. установить в 1 если не нужно оповещать юзера о том что он забанен.
 * @param  string $sContext Контекст (для лога админских действий)
 * @param $sContext
 * @param bool $noticeSbrPartners уведомить партнеров по сделке о блокировке аккаунта
 * @return object xajaxResponse
 */
function updateUserBan($sUsers = '', $nActId, $sReasonTxt = '', $nReasonId = null, $sDateTo = '', $nNoSend = 0, $sContext = '', $noticeSbrPartners = false)
{
    session_start();
    $objResponse = new xajaxResponse();
    if (hasPermissions('users')) {
        require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/users.php';
        require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/messages_spam.php';
        require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/messages.php';
        require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/sbr_emp.php';
        require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/sbr_frl.php';
        $objUser = new users();
        $nReasonId = $nReasonId ? $nReasonId : null;
        $aContext = _jsonArray($sContext);
        $aContext = $aContext ? $aContext : array('uid' => '', 'code' => 0, 'link' => '', 'name' => '');
        $aUsers = _jsonArray($sUsers);
        $bCheck = true;
        if ($aContext['uid'] == 'moder') {
            global $user_content;
            $bCheck = $user_content->checkContent($aContext['contentId'], $aContext['streamId'], $aContext['recId']);
        }
        if ($bCheck && $aUsers && hasPermissions('users')) {
            foreach ($aUsers as $sUid) {
                $objUser->GetUserByUID($sUid);
                if ($objUser->uid) {
                    $sReason = str_replace('%USERNAME%', $objUser->uname . ' ' . $objUser->usurname, $sReasonTxt);
                    $sReason = change_q($sReason, FALSE, 0, TRUE);
                    $sUniqId = "userban_{$sUid}";
                    $sObjName = $objUser->uname . ' ' . $objUser->usurname . '[' . $objUser->login . ']';
                    $sObjLink = '/users/' . $objUser->login;
                    if ($nActId == 1) {
                        // разблокируем
                        if ($objUser->is_banned || $objUser->ban_where) {
                            if ($objUser->is_banned) {
                                $objResponse->script("\$\$('.warnbutton-{$sUid}').setStyle('display','');");
                                $objResponse->script("\$\$('.warnlist-{$sUid}').set('html','');");
                                $objResponse->script("\$\$('span[id^=\"warn_{$user->uid}\"]').set('html', '0')");
                                $objResponse->script("\$\$('div[id^=\"warn_{$user->uid}\"]').set('html', '0')");
                            }
                            //$objUser->ban_where = 0;
                            $objUser->unsetUserBan($sUid, $objUser->ban_where);
                            // пишем лог админских действий
                            $nLogActId = $objUser->is_banned ? 4 : 6;
                            if ($objUser->self_deleted == 't') {
                                $nLogActId = admin_log::ACT_ID_RESTORE_ACC;
                            }
                            admin_log::addLog(admin_log::OBJ_CODE_USER, $nLogActId, $sUid, $sUid, $sObjName, $sObjLink, 0, '', $nReasonId, $sReason);
                        }
                        $objResponse->script("\$\$('.warnlink-{$sUid} a').set('html','Забанить!');");
                        $objResponse->script("\$\$('.comm-ban-{$sUid} a').set('html','Заблокировать');");
                        $objResponse->script("\$\$('.admin-block h4 em').setStyle('display','none');");
                        if ($objUser->uid == $aContext['uid']) {
                            $objResponse->script("\$('banreasonblock-{$objUser->uid}').setStyle('display','none');");
                        }
                        $warns = $objUser->GetWarns($sUid);
                        $warncount = $warns ? count($warns) : 0;
                        $objResponse->script("if(\$('warncount-{$sUid}')) { \$('warncount-{$sUid}').set('html', {$warncount}); }");
                    } else {
                        if ($sDateTo) {
                            $sError = '';
                            $aDate = explode('-', $sDateTo);
                            if (!$aDate[1] || !$aDate[2] || !$aDate[0] || !checkdate($aDate[1], $aDate[2], $aDate[0])) {
                                $sError = 'Укажите корректную конечную дату';
                            } elseif (($toRes = strtotime($sDateTo)) <= time()) {
                                $sError = 'Укажите конечную дату в будущем';
                            }
                            if ($sError) {
                                $objResponse->alert($sError);
                                $objResponse->script("\$('ban_btn').set( 'disabled', false );\$('ban_btn').set( 'value', 'Сохранить' );");
                                return $objResponse;
                            }
                        }
                        if ($objUser->is_banned || $objUser->ban_where) {
                            // редактируем текущую блокировку
                            $nBanWhere = $nActId == 3 ? 0 : 1;
                            $objUser->updateUserBan($sUid, $objUser->ban_where, $nBanWhere, $sReason, $nReasonId, $sDateTo);
                        } else {
                            $nBanWhere = $nActId == 3 ? 0 : 1;
                            $sBanId = $objUser->setUserBan($sUid, $nBanWhere, $sReason, $nReasonId, $sDateTo, $nNoSend);
                            // пишем лог админских действий
                            admin_log::addLog(admin_log::OBJ_CODE_USER, $nActId, $sUid, $sUid, $sObjName, $sObjLink, $aContext['code'], $aContext['link'], $nReasonId, $sReason, $sBanId, $aContext['name']);
                            // уведомляем партнеров по сбр
                            if ($noticeSbrPartners) {
                                if (is_emp($objUser->role)) {
                                    $sbr = new sbr_emp($sUid);
                                } else {
                                    $sbr = new sbr_frl($sUid);
                                }
                                $sbrPartners = $sbr->_new_getOpenSbrPartners();
                                $messages = new messages();
                                $messages->yourSbrPartnerIsBanned($sbrPartners, $objUser->login);
                            }
                            $objResponse->script("\$\$('.warnlink-{$sUid} a').set('html','Разбанить');");
                            $objResponse->script("\$\$('.comm-ban-{$sUid} a').set('html','Разблокировать');");
                            if (!$nBanWhere) {
                                $GLOBALS['session']->nullActivityByLogin($objUser->login);
                                // статус присутсвия ------
                                $online_status = $GLOBALS['session']->view_online_status($objUser->login, false);
                                $ago = $GLOBALS['session']->ago;
                                if (!$GLOBALS['session']->is_active && $objUser->last_time) {
                                    $fmt = 'ynjGi';
                                    if (time() - ($lt = strtotime($objUser->last_time)) > 24 * 3600) {
                                        $fmt = 'ynjG';
                                        if (time() - $lt > 30 * 24 * 3600) {
                                            $fmt = 'ynj';
                                        }
                                    }
                                    $ago = ago_pub($lt, $fmt);
                                }
                                if (!$ago) {
                                    $ago = "менее минуты";
                                }
                                $online_status .= '&nbsp;<span class="' . ($GLOBALS['session']->is_active ? 'u-act' : '') . '">' . ($GLOBALS['session']->is_active ? 'на сайте' : 'Был' . ($objUser->sex == 'f' ? 'а' : '') . ' на сайте: ' . $ago . ' назад') . '</span>';
                                //-------------------------
                                $objResponse->script("\$\$('.colB .bBA').set('html','{$online_status}');");
                            }
                        }
                        $warns = $objUser->GetWarns($sUid);
                        $warncount = $warns ? count($warns) : 0;
                        $objResponse->script("if(\$('warncount-{$sUid}')) { \$('warncount-{$sUid}').set('html', {$warncount}); }");
                        $sDisplay = $nBanWhere = $nActId == 3 ? 'none' : '';
                        if ($sDisplay == '' && $warncount == 3) {
                            $sDisplay = 'none';
                        }
                        $objResponse->script("\$\$('.warnbutton-{$sUid}').setStyle('display','{$sDisplay}');");
                        if ($objUser->uid == $aContext['uid']) {
                            $sDateToParts = preg_split("/-/", $sDateTo);
                            $admin_info = $objUser->getName(get_uid(), $ee);
                            $objResponse->assign('banreasonblock-text-' . $objUser->uid, 'innerHTML', 'Блокировка ' . ($nBanWhere ? 'везде' : 'в блогах') . ' ' . ($sDateTo ? 'до ' . $sDateToParts[2] . ' ' . monthtostr($sDateToParts[1], true) . ' ' . $sDateToParts[0] : 'навсегда'));
                            $objResponse->assign('banreasonblock-comment-' . $objUser->uid, 'innerHTML', reformat($sReason, 50));
                            $objResponse->assign('banreasonblock-date-' . $objUser->uid, 'innerHTML', date("d.m.Y H:i"));
                            $objResponse->assign('banreasonblock-admin-' . $objUser->uid, 'innerHTML', $admin_info['login']);
                            $objResponse->assign('banreasonblock-admin-' . $objUser->uid, 'href', '/users/' . $admin_info['login']);
                            $objResponse->script("\$('banreasonblock-{$objUser->uid}').setStyle('display','block');");
                        }
                        // удаляем все жалобы на спам для юзера
                        $oSpam = new messages_spam();
                        $oSpam->deleteSpamBySpamer($sUid, 3);
                    }
                    $objResponse->script("delete banned.buffer['userban_{$sUid}'];");
                    $str = "<b>Пользователь&nbsp;забанен</b>";
                    if ($objUser->is_banned) {
                        $str = "";
                    }
                    $objResponse->script("\n                    if (\$('user_banned_" . $objUser->uid . "')) { \n                    \t\$('user_banned_" . $objUser->uid . "').set('html', '{$str}');\n                    }else {\n                    \tvar p = \$('user_first_paragraph_" . $objUser->uid . "');                    \t\n                    \tif (p) {\n                    \t\tvar span = new Element('span', {\"style\":\"color:#000\", \"id\":\"user_banned_" . $objUser->uid . "\"});\n                    \t\tspan.inject(p, 'bottom');\n\t\t\t\t\t\t\tspan.set('html', '{$str}');                 \t\t\n                    \t}\n                    }\n                    ");
                }
            }
        }
        if ($aContext['uid'] == 'gray_ip') {
            $objResponse->script('if(window.opener){window.opener.window.location.reload(true);}');
        }
        $objResponse->script("\$\$(\"div[id^='ov-notice']\").setStyle('display', 'none');");
        $objResponse->script("\$('ov-notice22').toggleClass('b-shadow_hide');");
        $objResponse->script("if(banned.reload==1){window.location.reload(true);}");
        $objResponse->script("if(banned.zero){banned.zeroShow();}");
        $objResponse->script("if(typeof(adminLogCheckUsers)!='undefined'){adminLogCheckUsers(false);};if(\$('chk_all')){\$('chk_all').checked=false;};");
        if ($aContext['uid'] == 'admin_log_page' || $aContext['uid'] == 'admin_user_search') {
            $objResponse->script('window.location.reload(true)');
        }
        if ($aContext['uid'] == 'moder') {
            // если бан делается из потока модерирования
            $objResponse->script('user_content.resolveContent(user_content.resolveSid, 2, user_content.resolveUid)');
            $objResponse->script("parent.\$\$(\"div[id^='ov-notice']\").setStyle('display', 'none');");
            $objResponse->script("parent.\$('ov-notice22').toggleClass('b-shadow_hide');");
        }
    }
    return $objResponse;
}