• Модуль: xdimport
  • Путь к файлу: ~/bitrix/modules/xdimport/classes/general/lf_scheme.php
  • Класс: CAllXDILFScheme
  • Вызов: CAllXDILFScheme::CheckRequest
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();"; }