static function CheckRequest()
{
global $DB;
if (!CModule::IncludeModule("socialnetwork"))
{
return "";
}
$current_time = time();
$time_of_exec = false;
$rsScheme = CXDILFScheme::GetList(array(), array("ACTIVE"=>"Y", "AUTO"=>"Y"));
while(
($arScheme = $rsScheme->Fetch())
&& $time_of_exec === false
)
{
if ($arScheme["LAST_EXECUTED"] == '')
{
continue;
}
$last_executed = MakeTimeStamp(ConvertDateTime($arScheme["LAST_EXECUTED"], "DD.MM.YYYY HH:MI:SS"), "DD.MM.YYYY HH:MI:SS");
if ($last_executed <= 0)
{
continue;
}
$arEventTmp = CSocNetLogTools::FindLogEventByID($arScheme["EVENT_ID"]);
if (
array_key_exists("REAL_EVENT_ID", $arEventTmp)
&& $arEventTmp["REAL_EVENT_ID"] <> ''
)
{
$arScheme["EVENT_ID"] = $arEventTmp["REAL_EVENT_ID"];
}
//parse schedule
$arDoM = CXDImport::ParseDaysOfMonth($arScheme["DAYS_OF_MONTH"]);
$arDoW = CXDImport::ParseDaysOfWeek($arScheme["DAYS_OF_WEEK"]);
$arToD = CXDImport::ParseTimesOfDay($arScheme["TIMES_OF_DAY"]);
if($arToD)
sort($arToD, SORT_NUMERIC);
$arSDate = localtime($last_executed);
//sdate = truncate(last_execute)
$sdate = mktime(0, 0, 0, $arSDate[4]+1, $arSDate[3], $arSDate[5]+1900);
while (
$sdate < $current_time
&& $time_of_exec === false
)
{
$arSDate = localtime($sdate);
if($arSDate[6]==0) $arSDate[6]=7;
//determine if date is good for execution
if($arDoM)
{
$flag = array_search($arSDate[3], $arDoM);
if($arDoW)
$flag = array_search($arSDate[6], $arDoW);
}
elseif($arDoW)
$flag = array_search($arSDate[6], $arDoW);
else
$flag=false;
if($flag !== false && $arToD)
foreach($arToD as $intToD)
{
if($sdate+$intToD > $last_executed && $sdate+$intToD <= $current_time)
{
$time_of_exec = $sdate+$intToD;
break;
}
}
$sdate = mktime(0, 0, 0, date("m",$sdate), date("d",$sdate)+1, date("Y",$sdate));//next day
}
$arResponse = false;
if($time_of_exec !== false)
{
if ($arScheme["TYPE"] == "XML")
{
$arParams = array();
if ($arScheme["PARAMS"] <> '')
{
$arTmp = explode("&", $arScheme["PARAMS"]);
if (is_array($arTmp) && count($arTmp) > 0)
foreach($arTmp as $pair)
{
list ($key, $value) = explode("=", $pair);
$arParams[$key] = $value;
}
}
$arResponse = CXDILFSchemeXML::Request(
$arScheme["HOST"],
$arScheme["PAGE"],
$arScheme["PORT"],
$arScheme["METHOD"],
"http://".$arScheme["HOST"],
$arScheme["LOGIN"],
$arScheme["PASSWORD"],
$arParams
);
if (
$arResponse
&& is_array($arResponse)
)
{
if (XDI_DEBUG)
{
CXDImport::WriteToLog("Successful webservice response, scheme ID: ".$arScheme["ID"], "RXML");
}
$entityName = $arScheme["NAME"];
if ($arScheme["EVENT_ID"] == "news")
{
$rsIBlock = CIBlock::GetList(
array("ID" => "ASC"),
array("ACTIVE" => "Y", "TYPE" => "news", "ID" => $arScheme["ENTITY_ID"])
);
if ($arIBlock = $rsIBlock->Fetch())
{
$entityName = $arIBlock["NAME"];
}
}
$arLogParams = array(
"ENTITY_NAME" => $entityName,
"ENTITY_URL" => $arResponse["URL"]
);
$arSonetFields = array(
"SITE_ID" => $arScheme["LID"],
"ENTITY_TYPE" => $arScheme["ENTITY_TYPE"],
"ENTITY_ID" => $arScheme["ENTITY_ID"],
"EVENT_ID" => $arScheme["EVENT_ID"],
"ENABLE_COMMENTS" => $arScheme["ENABLE_COMMENTS"],
"=LOG_DATE" => $GLOBALS["DB"]->CurrentTimeFunction(),
"TITLE_TEMPLATE" => $arResponse["TITLE"],
"TITLE" => $arResponse["TITLE"],
"MESSAGE" => $arResponse["MESSAGE"],
"TEXT_MESSAGE" => $arResponse["TEXT_MESSAGE"],
"URL" => $arResponse["URL"],
"PARAMS" => serialize($arLogParams),
"MODULE_ID" => false,
"CALLBACK_FUNC" => false
);
$logID = CSocNetLog::Add($arSonetFields, false);
if (intval($logID) > 0)
{
$arUpdateFields = array(
"TMP_ID" => $logID,
"RATING_TYPE_ID" => "LOG_ENTRY",
"RATING_ENTITY_ID" => $logID
);
CSocNetLog::Update($logID, $arUpdateFields);
CXDILFScheme::SetSonetLogRights($logID, $arScheme["ENTITY_TYPE"], $arScheme["ENTITY_ID"], $arScheme["EVENT_ID"]);
CSocNetLog::CounterIncrement($logID);
if (
$arScheme["ENTITY_TYPE"] == SONET_SUBSCRIBE_ENTITY_GROUP
&& intval($arScheme["ENTITY_ID"]) > 0
)
{
$notify_title_tmp = str_replace(Array("rn", "n"), " ", $arScheme["NAME"]);
$notify_title = TruncateText($notify_title_tmp, 100);
$notify_title_out = TruncateText($notify_title_tmp, 255);
$arNotifyParams = array(
"LOG_ID" => $logID,
"GROUP_ID" => intval($arScheme["ENTITY_ID"]),
"NOTIFY_MESSAGE" => "",
"URL" => "",
"MESSAGE" => GetMessage("LFP_CLASS_SCHEME_IM_ADD", Array(
"#title#" => $notify_title,
)),
"MESSAGE_OUT" => GetMessage("LFP_CLASS_SCHEME_IM_ADD", Array(
"#title#" => $notify_title_out
)),
"EXCLUDE_USERS" => array()
);
CSocNetSubscription::NotifyGroup($arNotifyParams);
}
}
}
elseif (XDI_XML_ERROR_DEBUG)
{
CXDImport::WriteToLog("ERROR: Incorrect webservice response. Scheme ID: ".$arScheme["ID"].", server: ".$arScheme["HOST"].", port: ".$arScheme["PORT"].", page: ".$arScheme["PAGE"].", method: ".$arScheme["METHOD"].", params: ".$arScheme["PARAMS"], "RXML");
}
}
elseif ($arScheme["TYPE"] == "RSS")
{
$arResponse = CXDILFSchemeRSS::Request(
$arScheme["HOST"],
$arScheme["PAGE"],
$arScheme["PORT"],
$arScheme["PARAMS"],
$arScheme["URI"]
);
if (
$arResponse
&& is_array($arResponse)
&& array_key_exists("item", $arResponse)
&& is_array($arResponse["item"])
&& count($arResponse["item"]) > 0
)
{
if (XDI_DEBUG)
{
CXDImport::WriteToLog("Successful RSS response. Scheme ID: ".$arScheme["ID"], "RRSS");
}
$sanitizer = false;
if ($arScheme["IS_HTML"] == "Y")
{
$sanitizer = new CBXSanitizer();
$sanitizer->SetLevel(CBXSanitizer::SECURE_LEVEL_LOW);
}
foreach($arResponse["item"] as $arItem)
{
$checksum = md5(serialize($arItem));
$rsLogEvents = CSocNetLog::GetList(
array(),
array(
"SITE_ID" => $arScheme["LID"],
"ENTITY_TYPE" => $arScheme["ENTITY_TYPE"],
"ENTITY_ID" => $arScheme["ENTITY_ID"],
"EVENT_ID" => $arScheme["EVENT_ID"],
"EXTERNAL_ID" => $checksum
),
false,
array("nTopCount" => 1),
array('ID')
);
$arLogEvent = $rsLogEvents->Fetch();
if (!$arLogEvent)
{
$entityName = $arScheme["NAME"];
if ($arScheme["EVENT_ID"] == "news")
{
$rsIBlock = CIBlock::GetList(
array("ID" => "ASC"),
array("ACTIVE" => "Y", "TYPE" => "news", "ID" => $arScheme["ENTITY_ID"])
);
if ($arIBlock = $rsIBlock->Fetch())
{
$entityName = $arIBlock["NAME"];
}
}
$arLogParams = array(
"SCHEME_ID" => $arScheme["ID"],
"ENTITY_NAME" => $entityName,
"ENTITY_URL" => $arResponse["link"]
);
if($arItem["pubDate"] <> '')
{
$arLogParams["SOURCE_TIMESTAMP"] = strtotime($arItem["pubDate"]);
}
$description = CUtil::binSubstr(preg_replace("#^(.*?)([s]*
)+[s]*[n]*[s]*$#is", "\1", $arItem["description"]), 0, 64500);
$description = BitrixMainTextUtfSafeString::rtrimInvalidUtf(CUtil::binSubstr($description, 0, 64000));
if (
$arScheme["IS_HTML"] == "Y"
&& $sanitizer
)
{
$sanitizer->ApplyDoubleEncode(false);
$description = $sanitizer->SanitizeHtml($description);
}
$arSonetFields = array(
"SITE_ID" => $arScheme["LID"],
"ENTITY_TYPE" => $arScheme["ENTITY_TYPE"],
"ENTITY_ID" => $arScheme["ENTITY_ID"],
"EVENT_ID" => $arScheme["EVENT_ID"],
"ENABLE_COMMENTS" => $arScheme["ENABLE_COMMENTS"],
"TITLE_TEMPLATE" => $arItem["title"],
"TITLE" => $arItem["title"],
"MESSAGE" => $description,
"TEXT_MESSAGE" => "",
"URL" => (self::IsSecureUrl($arItem["link"]) ? $arItem["link"] : ''),
"PARAMS" => serialize($arLogParams),
"MODULE_ID" => false,
"CALLBACK_FUNC" => false,
"EXTERNAL_ID" => $checksum,
"=LOG_DATE" => $GLOBALS["DB"]->CurrentTimeFunction()
);
$logID = CSocNetLog::Add($arSonetFields, false);
if (intval($logID) > 0)
{
$arUpdateFields = array(
"TMP_ID" => $logID,
"RATING_TYPE_ID" => "LOG_ENTRY",
"RATING_ENTITY_ID" => $logID
);
CSocNetLog::Update($logID, $arUpdateFields);
CXDILFScheme::SetSonetLogRights($logID, $arScheme["ENTITY_TYPE"], $arScheme["ENTITY_ID"], $arScheme["EVENT_ID"]);
CSocNetLog::CounterIncrement($logID);
if (
$arScheme["ENTITY_TYPE"] == SONET_SUBSCRIBE_ENTITY_GROUP
&& intval($arScheme["ENTITY_ID"]) > 0
)
{
$notify_title_tmp = str_replace(Array("rn", "n"), " ", $arScheme["NAME"]);
$notify_title = TruncateText($notify_title_tmp, 100);
$notify_title_out = TruncateText($notify_title_tmp, 255);
$arNotifyParams = array(
"LOG_ID" => $logID,
"GROUP_ID" => intval($arScheme["ENTITY_ID"]),
"NOTIFY_MESSAGE" => "",
"URL" => "",
"MESSAGE" => GetMessage("LFP_CLASS_SCHEME_IM_ADD", Array(
"#title#" => $notify_title,
)),
"MESSAGE_OUT" => GetMessage("LFP_CLASS_SCHEME_IM_ADD", Array(
"#title#" => $notify_title_out
)),
"EXCLUDE_USERS" => array()
);
CSocNetSubscription::NotifyGroup($arNotifyParams);
}
}
}
elseif (XDI_DEBUG)
{
CXDImport::WriteToLog("RSS item is already in log. Scheme ID: ".$arScheme["ID"].", log ID: ".$arLogEvent["ID"], "RRSS");
}
}
}
elseif (XDI_XML_ERROR_DEBUG)
{
CXDImport::WriteToLog("ERROR: Incorrect RSS response. Scheme ID: ".$arScheme["ID"].", server: ".$arScheme["HOST"].", port: ".$arScheme["PORT"].", page: ".$arScheme["PAGE"].", params: ".$arScheme["PARAMS"], "RRSS");
}
}
if (
$arResponse
&& is_array($arResponse)
)
{
$strSql = "UPDATE b_xdi_lf_scheme SET LAST_EXECUTED=".$DB->GetNowFunction()." WHERE ID=".intval($arScheme["ID"]);
$DB->Query($strSql, false, "File: ".__FILE__."
Line: ".__LINE__);
}
else
{
$time_of_exec = false;
}
}
}
return "CXDILFScheme::CheckRequest();";
}