/** * Печатает содержимое файлов, при запросе /static.php?t=$seed. * Сжимает содержимое, контролирует кэширование на сервере и клиенте. * * @param string $seed закодировнная строка (параметр ?t). */ public function output($seed) { $log = $this->_log; if (($type = $this->_decodeSeed($seed, $seed_expired)) === false) { $log->writeln("\n\nstatic_compressor::output()\n"); $log->writeln("Error _decodeSeed - seed:{$seed}\n\n"); exit; } if ($seed_expired) { $seed = $this->_encodeSeed($type); } $last_mod = $this->getLastModified($type); $mem_key = md5('static_compress.output' . $seed); $mem_data = $this->memBuff->get($mem_key); if (!$mem_data || $last_mod != $mem_data['last_mod']) { $mem_data['body'] = $this->_compress($type, true); $mem_data['etag'] = '"' . md5($mem_data['body']) . '"'; $mem_data['last_mod'] = $last_mod; $mem_data['length'] = strlen($mem_data['body']); $this->memBuff->set($mem_key, $mem_data, self::GC_LIFE); } header('Content-Type: text/' . ($this->types[$type] == 'js' ? 'javascript' : 'css') . '; charset=' . self::getCharsetType($type)); header('Cache-Control: public, must-revalidate, max-age=0'); header('ETag: ' . $mem_data['etag']); header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $mem_data['last_mod']) . ' GMT'); if (isset($_SERVER['HTTP_IF_NONE_MATCH']) && $_SERVER['HTTP_IF_NONE_MATCH'] == $mem_data['etag'] && (!isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) || strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) >= $mem_data['last_mod'])) { header('HTTP/1.1 304 Not Modified'); $mem_data['length'] = 0; $mem_data['body'] = null; } header('Content-Length: ' . $mem_data['length']); exit($mem_data['body']); }
public function process_event(&$event) { $r = FALSE; switch ($event->type) { case 'memcache_delete': require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/memBuff.php'; $memBuff = new memBuff(); $memBuff->delete($event->data['key']); $r = TRUE; break; case 'memcache_flush_group': require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/memBuff.php'; $memBuff = new memBuff(); $memBuff->flushGroup($event->data['key']); $r = TRUE; break; case 'static_compress.createBatchBySeed': $GLOBALS['DEBUG_VAR'] = array(); require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/static_compress.php'; $memBuff = new memBuff(); $memBuff->set('eto.kostyl.inache.tupit.set.v.createBatch', 1, 1); $stc = new static_compress(); $r = !($error = $stc->createBatchBySeed($event->data['seed'])); break; } if ($event->type) { $this->log->notice("Function {$event->type}... " . ($r ? 'Success' : 'Error ' . $error)); $this->log->notice(base64_decode($event->data['seed'])); $this->log->notice(var_export($GLOBALS['DEBUG_VAR'])); } return PGQ_EVENT_OK; }
/** * Сохраняет или возвращает данные связывающие рассылку в личку с рассылкой в почту. Данные актуальны с * момента начала рассылки и до ее окончания. Данные хранятся в переменной (т.к. скрипт постоянно запущен) и * дублируются в memcahce на случай отключения скрипта во время рассылки. Если во время рассылки в личку * остановить скрипт и перегрузить memcahce, то данные данные потеряются и рассылка в почту не пойдет. * Если сделать то же во время рассылки на почту, есть вероятность отправить части пользователей повторные * письма. * * @param integer $messId id личного сообщения * @param array $data массив с данными для сохранения или NULL если данные нужно получить * @return array если $data == NULL, возвращает массив данных для $messId */ public function bind($messId, $data = NULL) { $cache = new memBuff(); $idx = -1; if (empty($this->_binds)) { $this->_binds = $cache->get(self::MASSSEND_BIND_CACHE_KEY); if (!is_array($this->_binds)) { $this->_binds = array(); } } if (count($this->_binds) >= 100) { array_shift($this->_binds); } for ($i = count($this->_binds) - 1; $i >= 0; $i--) { if ($this->_binds[$i]['__messId'] == $messId) { $idx = $i; break; } } if (is_null($data)) { return $idx >= 0 ? $this->_binds[$idx] : array(); } else { $data['__messId'] = $messId; if ($idx >= 0) { $this->_binds[$idx] = $data; } else { $this->_binds[] = $data; } $cache->set(self::MASSSEND_BIND_CACHE_KEY, $this->_binds, 3600 * 48); } }
/** * Обновить кеш цен * * @global type $DB * @return boolean */ public static function updateCache() { global $DB; self::$_cache_data = null; $data = $DB->rows("SELECT * FROM " . get_class($this)); if ($data) { //Преобразуем в удобную форму пользования foreach ($data as $el) { self::$_cache_data[$el['op_code']][$el['param']] = $el['sum']; } $memBuff = new memBuff(); return $memBuff->set(self::OP_CODES_PRICE_MEMCACHE_TAG, self::$_cache_data, self::OP_CODES_PRICE_MEMCACHE_LIFE); } return false; }
/** * Получает курсы валют с сайта ЦБ * * @return array массив, индексированный кодами валют (USD, EUR и т.д.), элементы которого есть свойства данной валюты. * Курс рубля к каждой валюте берется из свойства 'Value'. */ function getCBRates() { static $rates = NULL; if ($rates) { return $rates; } $memBuff = new memBuff(); $curr_day = strtotime(date('d.m.Y')); if ($rdata = $memBuff->get('getCBRates')) { $rates = $rdata['rates']; if ($rdata['day'] == $curr_day) { return $rates; } } $xml = @file_get_contents('http://www.cbr.ru/scripts/XML_daily.asp', false, stream_context_create(array('http' => array('timeout' => 1)))); //было 5 сек if ($xml && get_http_response_code($http_response_header) == 200) { $xmlDoc = new DOMDocument(); if (@$xmlDoc->loadXML($xml)) { $rates = NULL; $xpath = new DOMXPath($xmlDoc); $valutes = $xpath->query('//Valute/CharCode'); foreach ($valutes as $v) { $name = $v->nodeValue; if ($children = $v->parentNode->childNodes) { foreach ($children as $ch) { if ($ch->nodeType == XML_ELEMENT_NODE) { $rates[$name][$ch->nodeName] = $ch->nodeValue; } } } } //@todo: кешируем курс пока на сутки потом нужно перерабоать в крон и БД $memBuff->set('getCBRates', array('day' => $curr_day, 'rates' => $rates), 86400); } } return $rates; }
/** * Возвращает количество жалоб о спаме, удовлетворяющих условиям выборки * * @param array $filter фильтр * @return int */ function getSpamCount($filter = array()) { $DB = new DB(); // plproxy $aFilter = array(); $oMemBuf = new memBuff(); $nCount = 0; if (is_array($filter) && count($filter)) { foreach ($filter as $sKey => $sVal) { $aFilter[] = array($sKey, $sVal); } } if (empty($aFilter) && ($nCount = $oMemBuf->get('messages_spam_count')) !== false) { return $nCount; } else { $sQuery = 'SELECT messages_spam_get_count(?a)'; $nCount = $DB->val($sQuery, $aFilter); if (empty($aFilter) && !$DB->error) { $oMemBuf->set('messages_spam_count', $nCount, 3600); } } return $nCount; }
/** * ¬озвращает список публичных типовых услуг по заданным услови¤м и пагинацией * * @return array */ public function getList($excluded_ids = array()) { $criteria = array($this->category_id, $this->city_id, $this->country_id, $this->keywords, $this->limit, $this->offset, $this->price_ranges, $this->price_max, $this->order, $excluded_ids, $this->user_id); $membuf = new memBuff(); $memkey = __METHOD__ . '#' . md5(serialize($criteria)); if (false !== ($result = $membuf->get($memkey)) && is_release()) { return $result; } $sort = $this->getSort(); # @see http://sphinxsearch.com/forum/view.html?id=11538 about city = x or country = y $sphinxClient = new SphinxClient(); $sphinxClient->SetServer(SEARCHHOST, SEARCHPORT); $sphinxClient->SetLimits($this->offset, $this->limit, 20000); $sphinxClient->SetSortMode(SPH_SORT_EXTENDED, $sort); $sphinxClient->SetFieldWeights(array('title' => 2, 'extra_title' => 1)); //$sphinxClient->SetRankingMode(SPH_RANK_PROXIMITY_BM25); $selectExpression = '*'; // все колонки if ($this->user_id) { $selectExpression .= ", IF(user_id = {$this->user_id}, 1, 0) as match_user"; $sphinxClient->setFilter('match_user', array(1)); } if ($this->category_id) { $selectExpression .= ", IF(category_id = {$this->category_id} or category_parent_id = {$this->category_id}, 1, 0) as match_category"; $sphinxClient->setFilter('match_category', array(1)); } if ($this->country_id) { $selectExpression .= ", IF(user_country_id = {$this->country_id} or country_id = {$this->country_id}, 1, 0) as match_country"; $sphinxClient->setFilter('match_country', array(1)); } if ($this->city_id) { $selectExpression .= ", IF(user_city_id = {$this->city_id} or city_id = {$this->city_id}, 1, 0) as match_city"; $sphinxClient->setFilter('match_city', array(1)); } if (count($this->price_ranges)) { $match_price_exprs = array(); foreach ($this->getPriceRanges() as $i => $price_range) { if (!isset($this->price_ranges[$i])) { continue; } $match_price_exprs[] = "price_{$i} = 1"; } $match_price_exprs = implode(' or ', $match_price_exprs); $selectExpression .= ", IF({$match_price_exprs}, 1, 0) as match_price"; $sphinxClient->setFilter('match_price', array(1)); } if ($this->price_max > 0) { $selectExpression .= ", IF(price <= {$this->price_max}, 1, 0) as match_price_max"; $sphinxClient->setFilter('match_price_max', array(1)); } $searchString = ''; if (!empty($this->keywords)) { $keywords = implode(' ', array_filter(preg_split('/\\s*,\\s*/', $this->keywords))); $searchString = trim($keywords); //$searchString = $this->GetSphinxKeyword($searchString); $sphinxClient->SetMatchMode(SPH_MATCH_ANY); //SPH_MATCH_EXTENDED2); } if (count($excluded_ids)) { $sphinxClient->setFilter('tservice_id', $excluded_ids, true); } $sphinxClient->SetSelect($selectExpression); $queryResult = $sphinxClient->query($searchString, "tservices;delta_tservices"); //echo '<pre>error: ', $sphinxClient->GetLastError(), '</pre>'; //echo '<pre>warn : ', $sphinxClient->GetLastWarning(), '</pre>'; $list = array(); $total = 0; if (isset($queryResult['matches'])) { foreach ($queryResult['matches'] as $id => $row) { $row['attrs']['id'] = $id; $list[] = $row['attrs']; } $total = $queryResult['total_found'] < $queryResult['total'] ? $queryResult['total_found'] : $queryResult['total']; } $result = array('list' => $list, 'total' => $total); if ($this->_ttl) { $membuf->set($memkey, $result, $this->_ttl); } return $result; }
/** * Устанавливает таблицу для записи посещений. * @see stat_collector::Step1() * * @param string $table имя таблицы (stat_log|stat_log_t) * @param boolean $only_mem true: сохранить только в мемкэш, иначе еще и в БД. * @return boolean успешно? */ private function _setLogTable($table, $only_mem = false) { $MEM = new memBuff(); if ($only_mem || $this->_sDB->update('stat_variables', array('value' => $table), 'name = ?', 'log_table')) { return $MEM->set(stat_collector::LOGTBL_MEM_KEY, $table, 3000); } return false; }
/** * Запускает "постоянное соединение" и в цикле начинает проверять новые серверные события и отсылать их * клиентам. */ public function stream($type) { $timer = 0; $sConn = round(self::CONNECT_TTL * 0.7); $disconnect = false; $this->_isStream = true; // обязательно отключаем работу с сессией, т.к. скрипт работает длительное время // и он может переписать сделанные другими скриптами изменения на старые session_write_close(); ob_implicit_flush(true); $this->_counter('connects', 1); while (true) { // переодически сохраняем данные соединения if (++$timer % $sConn == 0) { $this->_saveConnect(); } // проверяем новые события при необходимости foreach ($this->_sEvents as $name => $event) { $time = microtime(true); $key = self::MEMBUFF_EVENTS_TIMER_KEY . $this->_uid . ':' . $name; $evTime = (int) $this->_memBuff->get($key); if ($evTime + $event['check'] < $time) { $this->_memBuff->set($key, $time, self::CONNECT_TTL); call_user_func(array($this, $event['func'])); } } // поспим sleep(1); // теперь можно все отдать клиенту $evid = $this->_counter('evid'); if ($this->_connect['evid'] < $evid) { $this->_sendEvent($this->_connect['evid'] + 1); $this->_connect['evid'] = $evid; $this->_saveConnect(); if ($type != 'hold') { $disconnect = true; } } if ($disconnect || $timer >= self::SCRIPT_LIVE) { break; } // и пробел для поддержания соеденения //$this->_sendByte(); } }
header("Location: " . str_replace($GLOBALS['host'], '', $location)); //перекидываем на текущую страницу, чтобы нельзя было повторить POST по F5 exit; break; } $header = "../header.php"; $footer = "../footer.html"; if (!$user->login) { include ABS_PATH . "/404.php"; exit; } $obj_memcache = new memBuff(); if ($_SESSION['login']) { if ($_SESSION['login'] != $user->login) { if (!$obj_memcache->get('user_view_' . strtolower($user->login) . '_' . strtolower($_SESSION['login']))) { $obj_memcache->set('user_view_' . strtolower($user->login) . '_' . strtolower($_SESSION['login']), 1, 3600); $user->IncHits($user->login); } } } else { if (!$obj_memcache->get('user_view_' . strtolower($user->login) . '_' . getRemoteIP())) { $obj_memcache->set('user_view_' . strtolower($user->login) . '_' . getRemoteIP(), 1, 3600); $user->IncHits($user->login); } } if ($user->is_banned && !hasPermissions('users')) { if (!$content) { $content = "ban.php"; } } else { if (!$content) {
/** * формирует превью проекта на главной странице. */ function GetPreview($data) { $objResponse = new xajaxResponse(); require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/projects.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/attachedfiles.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/CFile.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/HTML/projects_lenta.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/project_exrates.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/memBuff2.php'; $kind = 1; $memBuff = new memBuff(); $htmlLenta = $memBuff->get('projectsLentaHTML'); if (!$htmlLenta) { $prj = new new_projects(); $prjs = $prj->getProjects($num_prjs, -1, 1, false, null, true); foreach ($prjs as &$proj) { // стираем принадлежность проекта к пользователю, чтобы не появилось кнопок РЕДАКТИРОВАТЬ и пр. unset($proj['user_id']); } unset($proj); $htmlPrj = new HTMLProjects(); $htmlPrj->template = '/projects/tpl.lenta.new.php'; $prj_content = $htmlPrj->ShowProjects($num_prjs, $prjs, 1, 1, null, true); $prfs = new professions(); $profs = $prfs->GetAllProfessions('', 0, 1); // подложка с лентой проектов ob_start(); include $_SERVER['DOCUMENT_ROOT'] . '/templates/main.php'; $htmlLenta = ob_get_clean(); // кэшируем ленту проектов $memBuff->set('projectsLentaHTML', $htmlLenta, 1800); } // подготавливаем данные для шаблона в ленту проектов $row = array(); $row['kind'] = __paramValue('int', $data['kind']); $row['cost'] = __paramValue('int', $data['cost']); $row['currency'] = __paramValue('int', $data['currency_db_id']); $row['priceby'] = __paramValue('int', $data['priceby_db_id']); $row['name'] = stripslashes(__paramValue('html', $data['name'], null, true)); $contacts = array('phone' => array('name' => 'Телефон', 'value' => ''), 'site' => array('name' => 'Сайт', 'value' => ''), 'icq' => array('name' => 'ICQ', 'value' => ''), 'skype' => array('name' => 'Skype', 'value' => ''), 'email' => array('name' => 'E-mail', 'value' => '')); if (isset($data['contacts'])) { foreach ($data['contacts'] as $name => $value) { if (!isset($contacts[$name])) { continue; } switch ($name) { case 'site': if (!url_validate(ltrim(ltrim($value, 'http://'), 'https://')) && trim($value) != '') { $error["contact_{$name}"] = 'Поле заполнено некорректно'; } if (strpos($value, 'htt') === false && trim($value) != '') { $value = 'http://' . $value; } break; case 'email': if (!is_email($value) && trim($value) != '') { $error["contact_{$name}"] = 'Поле заполнено некорректно'; } break; } $contacts[$name]['value'] = __paramValue('htmltext', stripslashes($value)); } $row['contacts'] = serialize($contacts); } $descrFull = stripslashes(__paramValue('html', $data['descr'], null, true)); $descr = preg_replace('/^ /', "", $descrFull); $descr = preg_replace("/(\n) /", "\$1", $descr); $descr = reformat(strip_tags(htmlspecialchars(LenghtFormatEx(htmlspecialchars_decode($descr, ENT_QUOTES), 180), ENT_QUOTES), '<br />'), 50, 1, 0, 1); $descr = preg_replace("//", ' ', $descr); $row['descr'] = $descr; $row['t_is_payed'] = $data['logo_ok'] || $data['top_ok']; $row['t_is_ontop'] = __paramValue('bool', $data['top_ok']); $row['t_pro_only'] = $data['pro_only'] ? 't' : 'f'; $row['t_verify_only'] = $data['verify_only'] ? 't' : 'f'; $row['t_urgent'] = $data['urgent'] ? 't' : 'f'; $row['t_hide'] = $data['hide'] ? 't' : 'f'; $row['create_date'] = date('Y-m-d H:i', strtotime(date('Y-m-d H:i:s')) - 120); // делаем дату публикации 2 минуты назад $row['end_date'] = __paramValue('string', $data['end_date']); $row['win_date'] = __paramValue('string', $data['win_date']); $row['country'] = __paramValue('int', $data['project_location_columns'][0]); $row['city'] = __paramValue('int', $data['project_location_columns'][1]); list($row['country_name'], $row['city_name']) = explode(': ', __paramValue('string', $data['location'])); $logoOK = __paramValue('bool', $data['logo_ok']); $topOK = __paramValue('bool', $data['top_ok']); $row['link'] = __paramValue('string', $data['link']); if ($logoOK) { $logoAttach = new attachedfiles($data['logo_attachedfiles_session']); $logoFiles = $logoAttach->getFiles(array(1)); if (count($logoFiles)) { $logoFile = array_pop($logoFiles); // загружено может быть несколько файлов, берем последний $logoCFile = new CFile($logoFile['id']); } elseif (__paramValue('int', $data['logo_file_id'])) { $logoCFile = new CFile(__paramValue('int', $data['logo_file_id'])); } $row['logo_name'] = $logoCFile->name; $row['logo_path'] = $logoCFile->path; } $is_ajax = true; // подготовка данных для подробной страницы проекта $project = $row; $categories = array(); for ($i = 0; $i < 3; ++$i) { $categoryID = __paramValue('int', $data['project_profession' . $i . '_columns'][0]); $subcategoryID = __paramValue('int', $data['project_profession' . $i . '_spec_columns'][0]); if ($categoryID || $subcategoryID) { $categories[] = array('category_id' => $categoryID, 'subcategory_id' => $subcategoryID); } } $project['spec_txt'] = projects::_getSpecsStr($categories, ' / ', ', ', true); $project['ico_payed'] = $logoOK; $project['is_upped'] = $topOK; $project['descr'] = $descrFull; $project['logo_id'] = $logoCFile->id; $project['prefer_sbr'] = __paramValue('bool', $data['prefer_sbr']) ? 't' : 'f'; $project['urgent'] = __paramValue('bool', $data['urgent']) ? 't' : 'f'; $project['hide'] = __paramValue('bool', $data['hide']) ? 't' : 'f'; if (trim($project['contacts']) != '') { $contacts_employer = unserialize($project['contacts']); $empty_contacts_employer = 0; foreach ($contacts_employer as $name => $contact) { if (trim($contact['value']) == '') { $empty_contacts_employer++; } } $is_contacts_employer_empty = count($contacts_employer) == $empty_contacts_employer; } $isPreview = true; $project_exRates = project_exrates::GetAll(); $translate_exRates = array(0 => 2, 1 => 3, 2 => 4, 3 => 1); ob_start(); include $_SERVER['DOCUMENT_ROOT'] . '/public/new/tpl.preview.php'; ?> <?php $htmlProject = ob_get_clean(); $objResponse->assign('project_preview_lenta', 'innerHTML', $htmlLenta); $objResponse->assign('project_preview_content', 'innerHTML', $htmlProject); $objResponse->script('Public.showPreview()'); return $objResponse; }
/** * Создание счета @see class qiwipay. * * @param array $request параметры ($_POST). * * @return unknown */ public function createBill($request) { if (!$this->uid) { return 'Пользователь не определен'; } $account = new account(); $account->GetInfo($this->uid, true); if ($error = $this->validate($request, $account->id)) { return $error; } $this->DB->start(); $aData = array('account_id' => $account->id, 'phone' => $this->form['phone'], 'sum' => $this->form['sum']); $id = $this->DB->insert('qiwi_account', $aData, 'id'); if ($id) { $params = new createBill(); $params->login = $this->login; // логин $params->password = $this->passwd; // пароль $params->user = $this->form['phone']; // пользователь, которому выставляется счет $params->amount = $this->form['sum']; // сумма $params->comment = $this->form['comment']; // комментарий $params->txn = $id; // номер заказа $params->lifetime = $this->ltime; // время жизни (если пусто, используется по умолчанию 30 дней) $params->alarm = $this->alarm_sms; if ($this->passwd == 'debug') { $result = 1; } else { $result = $this->service->createBill($params)->createBillResult; } if ($err = $this->_checkResultError($result)) { $error['qiwi'] = $err; $this->DB->rollback(); die; return $error; } unset($aData['sum']); $sCode = substr($aData['phone'], 0, 3); $sNum = substr($aData['phone'], 3); $sOper = $this->DB->val('SELECT COALESCE(operator_id, 0) FROM mobile_operator_codes WHERE code = ? AND ? >= start_num AND ? <= end_num', $sCode, $sNum, $sNum); $aData['operator_id'] = $sOper; $this->DB->insert('qiwi_phone', $aData); $memBuff = new memBuff(); $nStamp = time(); $sKey = 'qiwiPhone' . $account->id . '_' . $aData['phone']; if (!($aData = $memBuff->get($sKey))) { $aData = array('time' => $nStamp, 'cnt' => 0); } $aData['time'] = $aData['time'] + 3600 > $nStamp ? $aData['time'] : $nStamp; $aData['cnt'] = $aData['time'] + 3600 > $nStamp ? $aData['cnt'] + 1 : 1; $memBuff->set($sKey, $aData, 3600); //----------------------------------- } $this->DB->commit(); $this->saveBillForm(); return 0; }
/** * Возвращает количество новых событий в проектах фрилансера. * * @param integer $user_id id фрилансера * @param boolean $waster учитывать проекты в корзине? * * @return integer */ public function GetNewFrlEventsCount($user_id, $waste = true) { global $DB; $mem = new memBuff(); $key = 'prjEventsCnt' . ($waste ? 'Wst' : '') . $user_id; $count = $mem->get($key); if ($count === FALSE || is_array($count)) { $ex_where = $waste ? '' : ' AND po.is_waste = false '; $sql = "\n SELECT count(po.*) \n FROM projects_offers AS po\n LEFT JOIN projects p \n ON p.id = po.project_id\n WHERE \n p.state = 0\n AND po.po_frl_read = false \n {$ex_where}\n AND po.user_id = ?i \n LIMIT 1"; $count = (int) $DB->val($sql, $user_id); $mem->set($key, $count, 1800); } return $count; }
/** * Берем данные за определенный год. * * @global type $DB * * @param mixed $year Год, если нет текущий * @param bool $set Записать данные сразу в переменные класса или нет * @param bool $cache Использовать кеш или нет * * @return type */ public function getExcDaysInit($year = false, $set = false, $cache = true) { global $DB; if ($year == false) { $year = $this->format('Y'); } $mem = new memBuff(); $exc_days = $cache ? $mem->get("exc_days_{$year}") : false; if ($exc_days === false) { $sql = 'SELECT * FROM exception_date WHERE year = ?'; $exc_days = $DB->row($sql, $year); $mem->set("exc_days_{$year}", $exc_days, 1800); } if (!$exc_days) { return array(); } $workdays = $this->initCollectionDate($exc_days['workdays']); $holidays = $this->initCollectionDate($exc_days['holidays']); if ($set) { $this->setWorkdays($workdays, true); $this->setHolidays($holidays, true); return; } return $exc_days; }
/** * Возвращает максимальную сумму покупки, проверив, покупал ли юзер * что-нибудь через Плати потом ранее. * * @param type $bill_id ИД счета * * @return int */ public function getMaxPrice($bill_id = 0) { $maxPrice = self::PRICE_MAX; if ($this->is_pro) { $maxPrice = self::PRICE_MAX_PRO; } else { $uid = get_uid(false); if ($uid > 0) { $memBuff = new memBuff(); if ($maxPriceSaved = $memBuff->get('platipotom_max_price_' . $uid)) { return $maxPriceSaved; } else { if (!$bill_id) { $account = new account(); $account->GetInfo($uid, true); $bill_id = $account->id; } $sql = 'SELECT id FROM account_operations WHERE op_code = 12 AND payment_sys = ?i AND billing_id = ?i'; $operation_id = $this->db()->val($sql, self::PAYMENT_CODE, $bill_id); if ($operation_id) { $maxPrice = self::PRICE_MAX_MORE; } $memBuff->set('platipotom_max_price_' . $uid, $maxPrice); } } } return $maxPrice; }
$mem->delete(CROSSDOMAINAUTH_KEY_NAME . $_GET['cdakey']); } else { mt_srand(); $key = md5(uniqid($_SERVER['HTTP_HOST'], true)); $back = HTTP_PREFIX . $_GET['subdomain'] . '.' . preg_replace('~^' . HTTP_PREFIX . '(?:www\\.)?~', '', $GLOBALS['host']) . '/'; if (!empty($_GET['direction'])) { $back .= 'catalog/' . $_GET['direction'] . '/'; } if (!empty($_GET['cat'])) { $back .= $_GET['cat'] . '/'; } if (!empty($_GET['dir'])) { $back .= $_GET['dir'] . '.html'; } $data = array('back' => $back, 'time' => mktime()); $mem->set(CROSSDOMAINAUTH_KEY_NAME . $key, $data, 120); $redirectUri = "{$GLOBALS['host']}/crossauth.php?cdakey={$key}"; //header("Location: {$GLOBALS['host']}/crossauth.php?cdakey={$key}"); //exit; } } require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/seo.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/city.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/country.php'; $g_page_id = '0|1'; session_start(); //$_SESSION['subdomain'] = $content_type = ''; $uid = get_uid(); $subdomain = $_GET['subdomain']; //@todo автоматом в эту переменную надо передавать субдомен
/** * Получение списка пользователей. * * @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); }
/** * Сохраняем объект в кэше. */ function fix() { if ($this->_memkey) { $data = array(); $memBuff = new memBuff(); foreach ($this as $member => $value) { $data[$member] = $value; } $memBuff->set($this->_memkey, $data, self::MEM_LIFE_TIME, self::getMemGrKey($_SESSION['login'])); } }
/** * Занести деньги на счет юзера (предполагается, что оплата прошла успешно) * * @param integer $op_id возвращает идентификатор платежной операции * @param integer $dep_id номер счета * @param float $ammount сумма перевода (numeric(8,2)) в FM * @param string $descr описание перевода * @param integer $payment_sys тип системы через которую осуществлен перевод * @param float $trs_sum кол-во денег в единицах исходной системы * @param integer $op_code номер операции (по дефолту - 12 занесение денег на счет) * @param integer $op_add Доп. инфа по операции (например id Сделки без Риска) * @return string возвращает сообщение об ошибке */ function deposit(&$op_id, $dep_id, $ammount, $descr, $payment_sys = 0, $trs_sum = 0, $op_code = 12, $op_add = 0, $date = 'now()') { global $DB; //setlocale(LC_ALL, "en_US"); //$ammount = (float)$ammount; // фикс (540.3/30) -- вместо 18.01 округление дает 18.00. //$ammount = round($ammount * 100) / 100; $row = $DB->row("\n SELECT u.uid, u.role, u.login \n FROM account AS a \n INNER JOIN users AS u ON (a.uid=u.uid) \n WHERE a.id = ?", $dep_id); if ($DB->error) { return $DB->error; } if (!$row) { return 'Аккаунт не существует'; } $this->uid = $row['uid']; $login = $row['login']; $this->GetInfo($this->uid); $memBuff = new memBuff(); $memBuff->set("ac_sum_old_" . $this->uid, $this->sum); $op_id = $DB->insert('account_operations', array('billing_id' => $dep_id, 'op_code' => $op_code, 'ammount' => $ammount, 'descr' => $descr, 'payment_sys' => $payment_sys, 'trs_sum' => $trs_sum, 'op_date' => $date), 'id'); if (!$op_id) { return "Ошибка сервера"; } // количество операций $_SESSION['account_operations'] = intval($_SESSION['account_operations']) + 1; // Обновляем сессию пользователю сразу // при поступлении денежных средств $session = new session(); $session->UpdateAccountSum($login); //if (!$result) { //session_start(); //$this->GetInfo($gid); //$_SESSION['ac_sum'] = $this->sum; // Обновляем сессию пользователю сразу // при поступлении денежных средств //$session = new session(); //$session->UpdateAccountSum($login); //} //if (!$result) { //$this->buyOrdersList($gid, $op_code, $login); // Обновляем сессию пользователю сразу при поступлении денежных средств //$session = new session(); //$session->UpdateAccountSum($login); //@todo: по идее более не используется /* require_once($_SERVER['DOCUMENT_ROOT'] . '/classes/sbr.php'); switch ($op_code) { case sbr::OP_RESERVE: // новая СБР. $sbr = new sbr_emp($gid); $sbr->setGetterSchemes(1);// Новая СБР $sbr->initFromId($op_add, false, false); if (!$sbr->error) { $sbr->reserve($op_id); $sbr_stage = $sbr->getStages(); foreach($sbr_stage as $stage) { $sbr->setUserReqvHistory($gid, intval($stage->data['id']), 0); // Сохраняем для всех этапов, Резервирование работодателя } } break; default: //Зачисление денег на счет }*/ //} return false; }
/** * Берем курсы валют на определенный день * * @param string $date Дата (в формате 01/01/2009), по умолчанию текущий день * @return array|boolean Курсы валют где ключ это название валюты а значение это массив [units=>Единиц, kurs=> Курс по отношению к рублю], либо false если не удалось взять курсы валют */ function getCurrencyForDate($date = false) { if (!$date) { $date = date("d/m/Y"); } $mb = new memBuff(); if ($tmp = $mb->get('currency_for_date')) { if ($tmp['date'] == $date && $tmp['data']) { return $tmp['data']; } } libxml_disable_entity_loader(); $file = file_get_contents("http://www.cbr.ru/scripts/XML_daily.asp?date_req={$date}&d=1"); // Валюты которые меняются раз в месяц $file2 = file_get_contents("http://www.cbr.ru/scripts/XML_daily.asp?date_req={$date}&d=0"); // Валюты которые меняются раз в день $p = simplexml_load_string($file); $p2 = simplexml_load_string($file2); $v = "Valute"; foreach ($p->{$v} as $key => $value) { $cur[(string) $value->CharCode] = array("units" => intval($value->Nominal), "kurs" => round(str_replace(",", ".", $value->Value), 4)); } foreach ($p2->{$v} as $key => $value) { $cur[(string) $value->CharCode] = array("units" => intval($value->Nominal), "kurs" => round(str_replace(",", ".", $value->Value), 4)); } if (!isset($cur)) { return false; } $cur['RUB'] = array("units" => 1, "kurs" => 1); // Заглушка для рубля $mb->set('currency_for_date', array('date' => $date, 'data' => $cur)); return $cur; }
ob_start(); $res = curl_exec($ch); $complete = ob_get_clean(); echo '<p>Результат <strong>paymentAviso</strong>:</p>'; echo '<pre>'; print_r(htmlspecialchars($complete)); echo '</pre>'; } echo '<p><a href="/bill/success/">Вернуться в магазин</a></p>'; exit; } else { //Данные платежной формы $paypost = $_POST; //Сохраняем в сессию, т.к. яндекс //это помнит при двух последующих запросах $memBuff->set($key, $paypost); } $payway = array(yandex_kassa::PAYMENT_YD => 'Яндекс.Деньги', yandex_kassa::PAYMENT_AC => 'Карта', yandex_kassa::PAYMENT_WM => 'Webmoney', yandex_kassa::PAYMENT_AB => 'Альфа-Клик', yandex_kassa::PAYMENT_SB => 'Сбербанк Онлайн'); ?> <h2>Тестовая оплата Яндекс.Касса</h2> <p> Оплата услуг аккаунт <strong>#<?php echo intval($paypost['customerNumber']); ?> </strong><br /> Cумма оплаты <strong><?php echo to_money($paypost['Sum'], 2); ?> рублей</strong><br /> Cпособ оплаты <strong><?php
/** * Проверка возможности отправить сообщение ползователю. * * @global type $DB * @staticvar null $exists_allowed * * @param type $to_id * @param type $from_id * * @return bool */ public static function isAllowed($to_id, $from_id = null) { $is_auth = isset($_SESSION['uid']) && $_SESSION['uid'] > 0; if (!$from_id && !$is_auth) { return false; } if (!$from_id) { $from_id = $_SESSION['uid']; } if ($is_auth && (currentUserHasPermissions('users') || is_emp())) { return true; } $is_allowed = self::_isAllowed($to_id, $from_id); if (!$is_allowed) { //Была ли уже проверка доступности //тогда пользователю запрещено писать $key_check_is_allowed = sprintf(self::KEY_CHECK_IS_ALLOWED, $from_id, $to_id); $mem = new memBuff(); if ($mem->get($key_check_is_allowed)) { return false; } //Иначе делаем проверку //Которые уже хотя бы раз общались с заказчиком через личку, //например если заказчик инициировал общение или они ранее общались $proxy_db = new DB(); $is_allowed = $proxy_db->val('SELECT messages_dialog_count(?i, ?i)', $to_id, $from_id) > 0; //Которых заказчик выбрал исполнителем в любом своем проекте if (!$is_allowed) { require_once ABS_PATH . '/classes/projects.php'; $is_allowed = (bool) projects::isExec($from_id, $to_id); } //В список условий я бы еще добавил проведение заказа на сайте - если есть завершенный заказ //(с резервом или без, по ТУ, проекту или прямой) с данным заказчиком, то тоже разрешать //исполнителю писать ему в личку, так как в заказе светится логин заказчика и они уже сотрудничали. if (!$is_allowed) { require_once ABS_PATH . '/tu/models/TServiceOrderModel.php'; $is_allowed = (bool) TServiceOrderModel::hasSuccessfulOrder($from_id, $to_id); } //Если фрилансер был выбран на любое призовое место в конкурсе то //он может писать сообщения заказчику. if (!$is_allowed) { require_once ABS_PATH . '/classes/contest.php'; $is_allowed = (bool) contest::isPrizePlace($from_id, $to_id); } if ($is_allowed) { self::setIsAllowed($to_id, $from_id, true); } $mem->set($key_check_is_allowed, 1, 0, self::KEY_CHECK_TAG_IS_ALLOWED); } return $is_allowed; }
function resendCode($sbr_id, $stage_id) { require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/pskb.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/memBuff.php'; $sbr_id = __paramValue('int', $sbr_id); $stage_id = __paramValue('int', $stage_id); $objResponse = new xajaxResponse(); $objResponse->script("\$('alert_sms').removeClass('b-layout__txt_color_56bd06').removeClass('b-layout__txt_color_c7271e'); "); if (!$sbr_id) { $objResponse->script("\$('alert_sms').addClass('b-layout__txt_color_c7271e'); \n \$('alert_sms').set('html', 'Запрос не может быть обработан.');"); //$objResponse->alert('Запрос не может быть обработан.'); return $objResponse; } $m = new memBuff(); $lasttime = $m->get(pskb::SMS_RESEND_KEY . $sbr_id); if ($lasttime) { $mins = ceil(($lasttime + 300 - time()) / 60); $objResponse->script("\$('alert_sms').addClass('b-layout__txt_color_c7271e'); \n \$('alert_sms').set('html', 'Еще раз выслать код можно будет через {$mins} минут" . ending($mins, 'у', 'ы', '') . ".');"); //$objResponse->alert("Повторный запрос можно будет сделать примерно через {$mins} минут" . ending($mins, 'у', 'ы', '') ); return $objResponse; } $uid = get_uid(0); if (!$uid) { $objResponse->redirect('/'); return $objResponse; } $sbr = sbr_meta::getInstance(); if (!$sbr->initFromId($sbr_id)) { $objResponse->script("\$('alert_sms').addClass('b-layout__txt_color_c7271e'); \n \$('alert_sms').set('html', 'Запрос не может быть обработан.');"); return $objResponse; } $stage = $sbr->initFromStage($stage_id, false); if (!$stage) { $objResponse->script("\$('alert_sms').addClass('b-layout__txt_color_c7271e'); \n \$('alert_sms').set('html', 'Запрос не может быть обработан.');"); return $objResponse; } if ($uid != $sbr->data['frl_id']) { $objResponse->script("\$('alert_sms').addClass('b-layout__txt_color_c7271e'); \n \$('alert_sms').set('html', 'Запрос не может быть обработан.');"); //$objResponse->alert('Запрос не может быть обработан.'); return $objResponse; } $pskb = new pskb($sbr); if (!$pskb->resendCode($stage)) { $objResponse->script("\$('alert_sms').addClass('b-layout__txt_color_c7271e'); \n \$('alert_sms').set('html', 'Не удалось выслать код.');"); //$objResponse->alert('Ошибка запроса. Попробуйте еще раз.'); return $objResponse; } $m->set(pskb::SMS_RESEND_KEY . $sbr_id, time(), 300); $objResponse->script("\$('alert_sms').addClass('b-layout__txt_color_56bd06'); \n \$('alert_sms').set('html', 'Код отправлен повторно.');\n \$('send_sms').destroy();\n \$('resend_sms').set('html', 'Еще раз выслать код можно будет через 5 минут.')"); //$objResponse->alert('Код отправлен повторно.'); if (defined('PSKB_TEST_MODE')) { $objResponse->script('document.location.reload();'); } return $objResponse; }
if ($email) { $user = new users(); $user = $user->getUserBySocialEmail($email); if (empty($user['login'])) { $action = ''; } else { $login = $user['login']; } } if ($login) { $user = new users(); if ($action == 'info') { $user->GetUserByLoginPasswd($login, $user->hashPasswd($pass)); } else { $user->GetUser($login); } if (empty($user->login)) { $action = ''; } } switch ($action) { case 'role': $result = array('result' => 'ok', 'role' => is_emp($user->role) ? 1 : 2); break; case 'info': $sbr = sbr_meta::getUserReqvs($user->uid); $result = array('result' => 'ok', 'user' => array('login' => $user->login, 'email' => $user->email, 'phone' => $sbr[$sbr['form_type']]['mob_phone'] != '' ? $sbr[$sbr['form_type']]['mob_phone'] : '', 'firstname' => $user->uname ? iconv('CP1251', 'UTF-8', $user->uname) : '', 'lastname' => $user->usurname ? iconv('CP1251', 'UTF-8', $user->usurname) : '', 'role' => is_emp($user->role) ? 1 : 2, 'avatar' => $user->photo != '' ? WDCPREFIX . '/users/' . $user->login . '/foto/' . $user->photo : '')); break; } $mem->set($key, $result, 600); echo json_encode($result);
/** * Создает новый счет, отправляет на регистрацию в платежную систему. * * @param integer $uid ид. пользователя. * @param array $request параметры ($_POST). * @return array $error массив ошибок. */ function createBill($request) { if (!$this->uid) { return 'Пользователь не определен'; } $account = new account(); $account->GetInfo($this->uid, true); if ($error = $this->validate($request, $account->id)) { return $error; } $this->DB->start(); $aData = array('account_id' => $account->id, 'phone' => $this->form['phone'], 'sum' => $this->form['sum']); $id = $this->DB->insert("qiwi_account", $aData, "id"); $oper_xml = ''; switch ($request['oper_code']) { case 'megafon': $oper_xml = '<extra name="megafon2-acc">1</extra>'; break; case 'mts': $oper_xml = '<extra name="mts-acc">1</extra>'; break; case 'beeline': $oper_xml = '<extra name="beeline-acc">1</extra>'; break; } if ($id) { $xml = '<?xml version="1.0" encoding="' . $this->encode . '"?>' . '<request>' . '<protocol-version>4.00</protocol-version>' . '<request-type>30</request-type>' . '<extra name="password">' . $this->passwd . '</extra>' . '<terminal-id>' . $this->login . '</terminal-id>' . '<extra name="txn-id">' . $id . '</extra>' . '<extra name="to-account">' . $this->form['phone'] . '</extra>' . '<extra name="amount">' . $this->form['sum'] . '</extra>' . '<extra name="comment">' . $this->form['comment'] . '</extra>' . '<extra name="create-agt">' . $this->create_agt . '</extra>' . '<extra name="ltime">' . $this->ltime . '</extra>' . '<extra name="ALARM_SMS">' . $this->alarm_sms . '</extra>' . '<extra name="ACCEPT_CALL">' . $this->accept_call . '</extra>' . $oper_xml . '</request>'; if ($this->passwd == 'debug') { $result = '<response><result-code fatal="false">0</result-code></response>'; } else { $result = $this->_request($xml); } if ($err = $this->_checkResultError($result)) { $error['qiwi'] = $err; $this->DB->rollback(); die; return $error; } // различные ограничения по телефонному номеру unset($aData['sum']); $sCode = substr($aData['phone'], 0, 3); $sNum = substr($aData['phone'], 3); $sOper = $this->DB->val('SELECT COALESCE(operator_id, 0) FROM mobile_operator_codes WHERE code = ? AND ? >= start_num AND ? <= end_num', $sCode, $sNum, $sNum); $aData['operator_id'] = $sOper; $this->DB->insert('qiwi_phone', $aData); $memBuff = new memBuff(); $nStamp = time(); $sKey = 'qiwiPhone' . $account->id . '_' . $aData['phone']; if (!($aData = $memBuff->get($sKey))) { $aData = array('time' => $nStamp, 'cnt' => 0); } $aData['time'] = $aData['time'] + 3600 > $nStamp ? $aData['time'] : $nStamp; $aData['cnt'] = $aData['time'] + 3600 > $nStamp ? $aData['cnt'] + 1 : 1; $memBuff->set($sKey, $aData, 3600); //----------------------------------- } $this->DB->commit(); $this->saveBillForm(); return 0; }
/** * Оплата выбранного сервиса и ответ пользователю об успехе или ошибке. */ public function processRequest() { if (!$this->_isValidated) { $this->validate(); } // Блокируем входящие запросы с данным ид., пока текущая операция не выполнится (см. self::_response()) $mcache = new memBuff(); $mkey = 'ifreepay.evtId' . $this->_request['evtId']; if ($mcache->get($mkey)) { $this->_errorif(TRUE, 'Предыдущий запрос в процессе обработки.'); } $mcache->set($mkey, 1, 60); $this->_oplock = $mkey; $op_id = 0; $dup = 0; $profit = floatval($this->_request['profit']); $currency_str = trim(strtoupper($this->_request['profitCurrency'])); // Внимание! Прежде чем менять текст описания операции, загляните в account::getSmsInfo() и sms_service::checkEvtId(). $descr = "SMS #{$this->_request['evtId']} с номера {$this->_request['phone']} ({$this->_request['country']})" . " на номер {$this->_request['serviceNumber']}, ID абонента {$this->_request['abonentId']}," . " оператор {$this->_request['operator']}, текст: {$this->_smsDecoded}, обработан {$this->_request['now']}," . " профит {$profit} {$currency_str}," . " номер попытки: " . intval($this->_request['retry']); // Для обработки повторных запросов (в случае сбоев на одной из сторон). if (intval($this->_request['retry']) > 0) { $dup = sms_services::checkEvtId($this->_request['evtId'], $op_id); } switch ($this->_type) { case 1: if (!$dup && $operator != 'i-Free') { $this->GetInfo($this->_user->uid); $this->_errorif(!$this->id, 'Счет пользователя не открыт.'); $error = $this->deposit($op_id, $this->id, $this->_tariff['fm_sum'], $descr, self::PAYMENT_SYS, $this->_tariff['usd_sum'], $this->_opcode); $this->_errorif(!!$error, $error); } $res_text = "Ваш счет пополнен на {$this->_tariff['fm_sum']} FM"; case 2: $new_password = users::ResetPasswordSMS($this->_user->uid, $this->_request['phone']); $this->_errorif(!$new_password, "Неверный логин или телефон не привязан к аккаунту."); if (!$dup) { $this->_errorif(!($tr_id = $this->start_transaction($this->_user->uid)), "Ошибка при проведении операции по счету."); $this->_errorif($this->BuyFromSMS($op_id, $tr_id, $this->_opcode, $this->_user->uid, $descr, '', $this->_tariff['usd_sum'], 1, self::PAYMENT_SYS), "Ошибка при проведении денежной операции."); } $res_text = "Ваш новый пароль: {$new_password}"; case 3: if (!$dup) { $answers = new projects_offers_answers(); $this->_errorif(!$answers->AddPayAnswers($this->_user->uid, 1), "Ошибка добавления ответа."); $this->_errorif(!($tr_id = $this->start_transaction($this->_user->uid)), "Ошибка при проведении операции по счету."); $this->_errorif($this->BuyFromSMS($op_id, $tr_id, $this->_opcode, $this->_user->uid, $descr, '', $this->_tariff['usd_sum'], 1, self::PAYMENT_SYS), "Ошибка при проведении денежной операции."); } $res_text = 'Спасибо за покупку. Теперь вы можете ответить на проект.'; default: $this->_errorif(true, "Тип услуги не найден."); } if (!$dup || $dup == sms_services::DUP_OP_NOTSAVED) { $sms_opid = sms_services::saveEvtId($op_id, $profit, $currency_str, $this->_request['evtId']); } $this->_response($res_text); }
die("Unknown mode\n"); } } else { $count = 0; $res = $master->query($sql); while ($user = pg_fetch_assoc($res)) { $msg = preg_replace("/\\{\\{([-_A-Za-z0-9]+)\\}\\}/e", "\$user['\\1']", $pMessage); $plproxy->query("SELECT messages_add(?, ?, ?, ?, ?a)", $sender['uid'], $user['uid'], $msg, TRUE, $pFiles); if ($count > 0 && $count % $printStatus == 0) { echo "Working... {$count} emails sended\n"; } $count++; } } $memBuff = new memBuff(); $memBuff->set("msgsCnt_updated", time()); if (is_null($count)) { die("Settings error\n"); } else { if ($count) { echo "OK. Total: {$count} users\n"; } else { echo "OK.\n"; } } if ($mass) { while (!$plproxy->val("SELECT COUNT(*) FROM messages(?) WHERE id = ?", $sender['uid'], $message_id)) { echo "Wait PGQ (10 seconds)...\n"; sleep(10); } $res = $plproxy->query("SELECT * FROM messages_zeros_userdata(?, ?)", $sender['uid'], $message_id);
/** * Сохраняет список подозрительных слов и регулярные выражения для модерирования пользовательского контента. * * @param int $nType тип: 1 - слова, 2 - регулярные выражения * @param bool $bMemBuf установить в true если данные брать из мемкеша * * @return array */ private function _getAdminStopWords($nType = 0, $bMemBuf = true) { $aWords = array(); $sMemKey = self::_getAdminStopWordsMemKey($nType); $oMemBuf = new memBuff(); if ($bMemBuf) { $aWords = $oMemBuf->get($sMemKey); } if (!$bMemBuf || $aWords === false) { $aWords = $GLOBALS['DB']->col('SELECT word FROM ' . self::$stop_words_table . ' WHERE type = ?i ORDER BY id', $nType); $oMemBuf->set($sMemKey, $aWords, 3600); } return $aWords; }
/** * Собирает FROM часть SQL запроса по условие выборки в $this->aGet. */ public function fseoSetFrom() { global $DB; $sRndSelect = ''; $sRndRestrict = ''; // если выборка должна быть случайной, то нужно случайное число if (!empty($this->aGet['random'])) { $memBuff = new memBuff(); if (!($nRnd = $memBuff->get('fseo_' . $this->sLinkId . '_rnd'))) { $nRnd = mt_rand(1, 1000); $memBuff->set('fseo_' . $this->sLinkId . '_rnd', $nRnd, self::CATALOG_MEM_LIFE); } $sRndSelect = ", fu.uid % {$nRnd} AS rnd_num"; $sRndRestrict = 'ORDER BY rnd_num LIMIT ' . self::RANDOM_LIMIT; } if (!empty($this->aGet['main_prof']) || !empty($this->aGet['additional_prof'])) { // когда есть основная или дополнительная профа $aSQL = array(); if (!empty($this->aGet['main_prof'])) { // когда есть основная профа $aSQL['main_choise'] = 'SELECT *' . $sRndSelect . ' FROM fu WHERE spec_orig = ' . $this->sSQLProfId; } elseif (!empty($this->aGet['additional_prof'])) { // когда есть дополнительная профа $aSQL['add_choise'] = 'SELECT fu.*' . $sRndSelect . ' FROM fu INNER JOIN spec_add_choise sp ON sp.user_id = fu.uid AND sp.prof_id = ' . $this->sSQLProfId . ' WHERE fu.is_pro = true'; $aSQL['paid_choise'] = 'SELECT fu.*' . $sRndSelect . ' FROM fu INNER JOIN spec_paid_choise pc ON pc.user_id = fu.uid AND pc.prof_id = ' . $this->sSQLProfId . ' AND pc.paid_to > NOW()'; } $sBegin = $sRndRestrict ? '((' : '('; $sEnd = $sRndRestrict ? ") {$sRndRestrict} ) AS s " : ' ) AS s '; $this->aSQL['from'] = $sBegin . implode(' UNION ALL ', $aSQL) . $sEnd; } else { // когда нет вообще никаких проф $this->aSQL['from'] = $sRndSelect ? '(SELECT *' . $sRndSelect . ' FROM fu ' . $sRndRestrict . ') s' : 'fu s'; } }
/** * Осуществляет операцию Запрос баланса Агента. * * @param bool $nocache запрещает брать данные из кэша. * * @return string ответ сервера */ public function balance($nocache = false) { $memBuff = new memBuff(); $balance = $nocache ? false : $memBuff->get(self::BALANCE_MEM_KEY); if ($balance === false) { if ($answer = $this->_send(array('ACT_CD' => self::ACT_BALANCE))) { $balance = $answer['balance']; $memBuff->set(self::BALANCE_MEM_KEY, $balance, 180); } } return $balance; }