1
0
Fork 0
mirror of https://github.com/Oreolek/ifhub.club.git synced 2024-07-08 09:24:25 +03:00
ifhub.club/engine/modules/ls/Ls.class.php
Mzhelskiy Maxim 95227c8e57 fix
2012-02-28 18:39:29 +04:00

303 lines
8.9 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/*-------------------------------------------------------
*
* LiveStreet Engine Social Networking
* Copyright © 2008 Mzhelskiy Maxim
*
*--------------------------------------------------------
*
* Official site: www.livestreet.ru
* Contact e-mail: rus.engine@gmail.com
*
* GNU General Public License, version 2:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
*
---------------------------------------------------------
*/
/**
* Модуль Ls
* Для выполнения служебных действий LiveStreet CMS.
* В частности для отправки на сервер LiveStreet информации о домене сайта, версии плагинов и LS.
* Эти данные не разглашаются и используются исключительно в целях развития LiveStreet CMS, оценки спроса, отслеживания интересов аудитории.
* Так же вы можете благодаря этому получать уведомления о новых версиях установленных плагинов и шаблонов.
* Вы всегда можете отключить передачу данных в конфиге, но просим этого не далать, тем самым вы поможете развитию LS CMS. Это важно для нас.
*
*/
class ModuleLs extends Module {
protected $sUrlLs='http://sender.livestreetcms.com/push/';
protected $aDataForSend=array();
protected $oMapper;
/**
* Инициализируем модуль
*
*/
public function Init() {
}
/**
* Запуск сбора данных
*
* @return bool
*/
public function SenderRun() {
if (!Config::Get('module.ls.send_general')) {
return false;
}
/**
* Вставка счетчика
*/
if (Config::Get('module.ls.use_counter')) {
// лучше вставлять в html_head_end, но здесь нужно постараться вставить код в самом конце, чтобы уменьшить вероятность повторного вызова GA, если сайт его использует
$this->Hook_AddExecModule('template_body_end','Ls_InjectCounter',-10000);
}
/**
* Отправка данных
*/
$this->SendToLs();
}
/**
* Вставка счетчика GA с учетом его возможного повторного использования
*
* @return mixed
*/
public function InjectCounter() {
/**
* Если _gaq уже определена, значит загружать js код GA не нужно
*/
$sCounter="
<script type=\"text/javascript\">
var _lsIsLoadGA=(typeof(window._gaq)=='undefined') ? false : true ;
var _gaq = _gaq || [];
_gaq.push(['lscounter._setAccount', 'UA-28922093-1']);
_gaq.push(['lscounter._trackPageview']);
if (!_lsIsLoadGA) {
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
}
</script>
";
return $sCounter;
}
/**
* Отправка данных на сервер LS
*/
protected function SendToLs() {
/**
* Ограничения на запуск отправки, чтобы не нагружать сайт
* Отправляем 1 раз в день ночью в промежутке 00:00-07:00, делаем по 20 попыток отправки в день
*/
if ((int)date('G')>=7) {
return;
}
if ($aData=$this->GetMarkerFile(date("Y-m-d")) and (isset($aData['is_send']) or (isset($aData['count_try']) and $aData['count_try']>20))) {
return;
}
$this->aDataForSend=$this->GetDataForSendToLs();
$bOk=false;
$sResponse=$this->getUrl($this->sUrlLs,$this->aDataForSend);
if ($sResponse===false) {
/**
* Отправка не удалась, скорее всего нет нужных расширений, пробуем передать данные через клиента инжекцией тега <img/>
* Такой способ отправки нужно делать только для админа сайта, чтобы не "засветить" данные третьим лицам.
*/
//$this->Hook_AddExecModule('template_body_end','Ls_InjectImgForSendToLs',-2000);
} else {
if ($sResponse=='accepted') {
$bOk=true;
} else {
// очень странная ситуация, скорее всего временно не работает сервер
}
}
/**
* Отмечаем факт отправки
*/
if ($bOk) {
$this->SuccessfulSendToLs();
} else {
$this->ErrorSendToLs();
}
}
/**
* Отмечает факт ошибки при отправки данных, увеличиваем число попыток
*/
protected function ErrorSendToLs() {
if (!($aData=$this->GetMarkerFile(date("Y-m-d")))) {
$aData=array();
}
if (isset($aData['count_try'])) {
$aData['count_try']++;
} else {
$aData['count_try']=1;
}
$this->SetMarkerFile(date("Y-m-d"),$aData);
}
/**
* Отмечает факт успешной отправки данных
*/
protected function SuccessfulSendToLs() {
$this->SetMarkerFile(date("Y-m-d"),array('is_send'=>1));
}
/**
* Читает данные из файла
*
* @param $sDate
* @return bool|mixed
*/
protected function GetMarkerFile($sDate) {
$sFile=Config::Get('sys.cache.dir').'lssender-'.$sDate;
if (!file_exists($sFile)) {
return false;
}
if ($aData=@unserialize(file_get_contents($sFile))) {
return $aData;
}
return false;
}
/**
* Записывает данные в файл
*
* @param $sDate
* @param $aData
* @return bool
*/
protected function SetMarkerFile($sDate,$aData) {
$sFile=Config::Get('sys.cache.dir').'lssender-'.$sDate;
if (@file_put_contents($sFile,serialize($aData))) {
return true;
}
return false;
}
/**
* Возвращает строчку для инжекции в шаблон
*
* @return string
*/
public function InjectImgForSendToLs() {
$this->SuccessfulSendToLs();
$sUrl=$this->sUrlLs.'img/?'.$this->makeGetParams($this->aDataForSend);
return '<img width="1" height="1" src="'.$sUrl.'">';
}
/**
* Возвращает данные для отправки
*
* @return array
*/
protected function GetDataForSendToLs() {
/**
* Формируем данные для отправки
*/
$aData=array();
$aData['ls_v']=LS_VERSION;
/**
* Список плагинов с версиями
*/
$aPlugins=$this->Plugin_GetList();
foreach($aPlugins as $aPlugin) {
$aData['plugins']['code'][]=$aPlugin['code'];
$aData['plugins']['ia'][]=$aPlugin['is_active'];
$aData['plugins']['v'][]=$aPlugin['property']->version;
}
/**
* Домен
*/
$aData['domain']=Config::Get('path.root.web');
return $aData;
}
/**
* Чтение URL
*
* @param $sUrl
* @param $aParams
* @return bool|mixed|string
*/
protected function getUrl($sUrl,$aParams) {
if (function_exists('curl_init')) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $sUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,$this->makeGetParams($aParams));
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
$sData = curl_exec($ch);
if (curl_errno($ch)) {
curl_close($ch);
return false;
}
curl_close($ch);
return $sData;
} else {
$aUrl=parse_url($sUrl);
$socket = @fsockopen($aUrl['host'], isset($aUrl['port']) ? $aUrl['port'] : 80, $errno, $errstr, 5);
if(!$socket) {
return false;
}
//собираем данные
$data = $this->makeGetParams($aParams);
fwrite($socket, "POST {$aUrl['path']} HTTP/1.1\r\n");
fwrite($socket, "Host: {$aUrl['host']}\r\n");
fwrite($socket,"Content-type: application/x-www-form-urlencoded\r\n");
fwrite($socket,"Content-length:".strlen($data)."\r\n");
fwrite($socket,"Accept:*/*\r\n");
fwrite($socket,"User-agent:Opera 10.00\r\n");
fwrite($socket,"Connection: Close\r\n");
fwrite($socket,"\r\n");
fwrite($socket,"$data\r\n");
fwrite($socket,"\r\n");
$sData = '';
while ( ($line = fgets($socket, 4096)) !== false) {
$sData.= $line;
}
//закрываем сокет
fclose($socket);
$sData = trim(substr($sData, strpos($sData, "\r\n\r\n") + 4));
return $sData;
}
}
/**
* Формирует строку GET параметров
*
* @param array $aParams
* @return array|string
*/
protected function makeGetParams($aParams=array()) {
$sGetParams='';
if (is_string($aParams) or count($aParams)){
$sGetParams=is_array($aParams) ? http_build_query($aParams,'','&') : $aParams;
}
return $sGetParams;
}
}
?>