%PDF- %PDF-
Direktori : /home/bitrix/www/bitrix/modules/socialnetwork/classes/general/ |
Current File : //home/bitrix/www/bitrix/modules/socialnetwork/classes/general/user_relations.php |
<? IncludeModuleLangFile(__FILE__); class CAllSocNetUserRelations { /***************************************/ /******** DATA MODIFICATION **********/ /***************************************/ function CheckFields($ACTION, &$arFields, $ID = 0) { global $DB, $arSocNetAllowedRelations; if ($ACTION != "ADD" && IntVal($ID) <= 0) { $GLOBALS["APPLICATION"]->ThrowException("System error 870164", "ERROR"); return false; } if ((is_set($arFields, "FIRST_USER_ID") || $ACTION=="ADD") && IntVal($arFields["FIRST_USER_ID"]) <= 0) { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("SONET_UR_EMPTY_FIRST_USER_ID"), "EMPTY_FIRST_USER_ID"); return false; } elseif (is_set($arFields, "FIRST_USER_ID")) { $dbResult = CUser::GetByID($arFields["FIRST_USER_ID"]); if (!$dbResult->Fetch()) { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("SONET_UR_ERROR_NO_FIRST_USER_ID"), "ERROR_NO_FIRST_USER_ID"); return false; } } if ((is_set($arFields, "SECOND_USER_ID") || $ACTION=="ADD") && IntVal($arFields["SECOND_USER_ID"]) <= 0) { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("SONET_UR_EMPTY_SECOND_USER_ID"), "EMPTY_SECOND_USER_ID"); return false; } elseif (is_set($arFields, "SECOND_USER_ID")) { $dbResult = CUser::GetByID($arFields["SECOND_USER_ID"]); if (!$dbResult->Fetch()) { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("SONET_UR_ERROR_NO_SECOND_USER_ID"), "ERROR_NO_SECOND_USER_ID"); return false; } } if ((is_set($arFields, "RELATION") || $ACTION=="ADD") && strlen($arFields["RELATION"]) <= 0) { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("SONET_UR_EMPTY_RELATION"), "EMPTY_RELATION"); return false; } elseif (is_set($arFields, "RELATION") && !in_array($arFields["RELATION"], $arSocNetAllowedRelations)) { $GLOBALS["APPLICATION"]->ThrowException(str_replace("#ID#", $arFields["RELATION"], GetMessage("SONET_UR_ERROR_NO_RELATION")), "ERROR_NO_RELATION"); return false; } elseif (is_set($arFields, "RELATION") && $arFields["RELATION"] == SONET_RELATIONS_TYPE_FRIENDS2) { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("SONET_UR_ERROR_RELATION_FRIENDS2"), "ERROR_RELATION_FRIENDS2"); return false; } if ((is_set($arFields, "INITIATED_BY") || $ACTION=="ADD") && !in_array($arFields["INITIATED_BY"], array("F", "S"))) $arFields["INITIATED_BY"] = "F"; if (is_set($arFields, "DATE_CREATE") && (!$DB->IsDate($arFields["DATE_CREATE"], false, LANG, "FULL"))) { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("SONET_UR_EMPTY_DATE_CREATE"), "EMPTY_DATE_CREATE"); return false; } if (is_set($arFields, "DATE_UPDATE") && (!$DB->IsDate($arFields["DATE_UPDATE"], false, LANG, "FULL"))) { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("SONET_UR_EMPTY_DATE_UPDATE"), "EMPTY_DATE_UPDATE"); return false; } return True; } public static function Delete($ID) { global $DB; if (!CSocNetGroup::__ValidateID($ID)) return false; $ID = IntVal($ID); $bSuccess = True; $rsUser2UserOld = $DB->Query("SELECT * FROM b_sonet_user_relations WHERE ID = ".$ID.""); if($arUser2UserOld = $rsUser2UserOld->Fetch()) { CSocNetSearch::OnUserRelationsChange($arUser2UserOld["FIRST_USER_ID"]); CSocNetSearch::OnUserRelationsChange($arUser2UserOld["SECOND_USER_ID"]); } $db_events = GetModuleEvents("socialnetwork", "OnBeforeSocNetUserRelationsDelete"); while ($arEvent = $db_events->Fetch()) if (ExecuteModuleEventEx($arEvent, array($ID))===false) return false; $events = GetModuleEvents("socialnetwork", "OnSocNetUserRelationsDelete"); while ($arEvent = $events->Fetch()) ExecuteModuleEventEx($arEvent, array($ID)); if ($bSuccess) { $arRelation = CSocNetUserRelations::GetByID($ID); $bSuccess = $DB->Query("DELETE FROM b_sonet_user_relations WHERE ID = ".$ID."", true); } if ($bSuccess) { if ($arRelation && $arRelation["RELATION"] == SONET_RELATIONS_FRIEND) $GLOBALS["DB"]->Query("DELETE FROM b_sonet_event_user_view WHERE ENTITY_TYPE = '".SONET_ENTITY_USER."' AND ( (USER_ID = ".$arRelation["FIRST_USER_ID"]." AND ENTITY_ID = ".$arRelation["SECOND_USER_ID"].") OR (USER_ID = ".$arRelation["SECOND_USER_ID"]." AND ENTITY_ID = ".$arRelation["FIRST_USER_ID"].") OR (ENTITY_ID = ".$arRelation["FIRST_USER_ID"]." AND USER_IM_ID = ".$arRelation["SECOND_USER_ID"].") OR (ENTITY_ID = ".$arRelation["SECOND_USER_ID"]." AND USER_IM_ID = ".$arRelation["FIRST_USER_ID"].") OR (USER_ID = ".$arRelation["FIRST_USER_ID"]." AND USER_IM_ID = ".$arRelation["SECOND_USER_ID"].") OR (USER_ID = ".$arRelation["SECOND_USER_ID"]." AND USER_IM_ID = ".$arRelation["FIRST_USER_ID"].") )", true); } return $bSuccess; } public static function DeleteNoDemand($userID) { global $DB; if (!CSocNetGroup::__ValidateID($userID)) return false; $userID = IntVal($userID); $bSuccess = True; $rsUser2UserOld = $DB->Query("SELECT * FROM b_sonet_user_relations WHERE FIRST_USER_ID = ".$userID." OR SECOND_USER_ID = ".$userID.""); while($arUser2UserOld = $rsUser2UserOld->Fetch()) { CSocNetSearch::OnUserRelationsChange($arUser2UserOld["FIRST_USER_ID"]); CSocNetSearch::OnUserRelationsChange($arUser2UserOld["SECOND_USER_ID"]); } if ($bSuccess) $bSuccess = $DB->Query("DELETE FROM b_sonet_user_relations WHERE FIRST_USER_ID = ".$userID." OR SECOND_USER_ID = ".$userID."", true); if ($bSuccess) $DB->Query("DELETE FROM b_sonet_event_user_view WHERE ENTITY_TYPE = '".SONET_ENTITY_USER."' AND ( USER_ID = ".$userID." OR ENTITY_ID = ".$userID." OR USER_IM_ID = ".$userID." )", true); CSocNetUserRelations::__SpeedFileDelete($userID); return $bSuccess; } /***************************************/ /********** DATA SELECTION ***********/ /***************************************/ public static function GetByID($ID) { global $DB; if (!CSocNetGroup::__ValidateID($ID)) return false; $ID = IntVal($ID); $dbResult = CSocNetUserRelations::GetList(Array(), Array("ID" => $ID)); if ($arResult = $dbResult->GetNext()) { return $arResult; } return False; } function GetByUserID($user1ID, $user2ID) { global $DB; $user1ID = IntVal($user1ID); if ($user1ID <= 0) return false; $user2ID = IntVal($user2ID); if ($user2ID <= 0) return false; $strSql = "SELECT ID, FIRST_USER_ID, SECOND_USER_ID, RELATION, DATE_CREATE, DATE_UPDATE, MESSAGE, INITIATED_BY ". "FROM b_sonet_user_relations ". "WHERE FIRST_USER_ID = ".$user1ID." AND SECOND_USER_ID = ".$user2ID." ". " OR FIRST_USER_ID = ".$user2ID." AND SECOND_USER_ID = ".$user1ID." "; $dbResult = $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__); if ($arResult = $dbResult->Fetch()) return $arResult; return False; } public static function GetRelatedUsers($userID, $relation, $arNavStartParams = false, $bActiveOnly = "N") { global $DB, $arSocNetAllowedRelations; $userID = IntVal($userID); if ($userID <= 0) return false; if (!in_array($relation, $arSocNetAllowedRelations)) return false; if (is_array($arNavStartParams) && IntVal($arNavStartParams["nTopCount"]) > 0) $arOrderBy = array( "RAND" => "ASC" ); else $arOrderBy = array( "DATE_UPDATE" => "DESC" ); $dbResult = CSocNetUserRelations::GetList( $arOrderBy, array( "USER_ID" => $userID, "RELATION" => $relation, "ACTIVE_ONLY" => $bActiveOnly ), false, $arNavStartParams, array("ID", "FIRST_USER_ID", "SECOND_USER_ID", "DATE_CREATE", "DATE_UPDATE", "INITIATED_BY", "FIRST_USER_NAME", "FIRST_USER_LAST_NAME", "FIRST_USER_PERSONAL_PHOTO", "FIRST_USER_PERSONAL_GENDER", "FIRST_USER_SECOND_NAME", "FIRST_USER_LOGIN", "FIRST_USER_EMAIL", "FIRST_USER_IS_ONLINE", "SECOND_USER_NAME", "SECOND_USER_LAST_NAME", "SECOND_USER_PERSONAL_PHOTO", "SECOND_USER_PERSONAL_GENDER", "SECOND_USER_SECOND_NAME", "SECOND_USER_LOGIN", "SECOND_USER_EMAIL", "SECOND_USER_IS_ONLINE" ) ); return $dbResult; } /***************************************/ /********** COMMON METHODS ***********/ /***************************************/ public static function GetRelation($firstUserID, $secondUserID) { global $DB; static $arSocNetURNCache = array(); static $arSocNetUserRelationsCache1 = array(); $firstUserID = IntVal($firstUserID); if ($firstUserID <= 0) { return false; } $secondUserID = IntVal($secondUserID); if ($secondUserID <= 0) { return false; } if (array_key_exists($firstUserID, $arSocNetURNCache)) { if (array_key_exists($secondUserID, $arSocNetURNCache[$firstUserID])) { return $arSocNetURNCache[$firstUserID][$secondUserID]; } elseif(count($arSocNetURNCache[$firstUserID]) != 100) { return false; } } elseif (array_key_exists($secondUserID, $arSocNetURNCache)) { if (array_key_exists($firstUserID, $arSocNetURNCache[$secondUserID])) { return $arSocNetURNCache[$secondUserID][$firstUserID]; } elseif(count($arSocNetURNCache[$secondUserID]) != 100) { return false; } } // get top N relations of user1 $arSocNetURNCache[$firstUserID] = array(); $dbResult = CSocNetUserRelations::GetRelationsTop($firstUserID, 100); while ($arResult = $dbResult->Fetch()) { if ($arResult["FIRST_USER_ID"] == $firstUserID) { $arSocNetURNCache[$firstUserID][$arResult["SECOND_USER_ID"]] = $arResult["RELATION"]; } else { $arSocNetURNCache[$firstUserID][$arResult["FIRST_USER_ID"]] = $arResult["RELATION"]; } } // get top N relations of user2 $arSocNetURNCache[$secondUserID] = array(); $dbResult = CSocNetUserRelations::GetRelationsTop($secondUserID, 100); while ($arResult = $dbResult->Fetch()) { if ($arResult["FIRST_USER_ID"] == $secondUserID) { $arSocNetURNCache[$secondUserID][$arResult["SECOND_USER_ID"]] = $arResult["RELATION"]; } else { $arSocNetURNCache[$secondUserID][$arResult["FIRST_USER_ID"]] = $arResult["RELATION"]; } } if (!array_key_exists($firstUserID."_".$secondUserID, $arSocNetUserRelationsCache1)) { $strSql = "SELECT UR.RELATION ". "FROM b_sonet_user_relations UR ". "WHERE UR.FIRST_USER_ID = ".$firstUserID." ". " AND UR.SECOND_USER_ID = ".$secondUserID." ". "UNION ". "SELECT UR.RELATION ". "FROM b_sonet_user_relations UR ". "WHERE UR.FIRST_USER_ID = ".$secondUserID." ". " AND UR.SECOND_USER_ID = ".$firstUserID." "; $dbResult = $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__); if ($arResult = $dbResult->Fetch()) { $arSocNetUserRelationsCache1[$firstUserID."_".$secondUserID] = $arResult["RELATION"]; } else { $arSocNetUserRelationsCache1[$firstUserID."_".$secondUserID] = false; } } return $arSocNetUserRelationsCache1[$firstUserID."_".$secondUserID]; } public static function IsFriends($firstUserID, $secondUserID) { global $DB; static $arSocNetUserRelationsCache = array(); $firstUserID = IntVal($firstUserID); if ($firstUserID <= 0) { return false; } $secondUserID = IntVal($secondUserID); if ($secondUserID <= 0) { return false; } if (!array_key_exists($firstUserID."_".$secondUserID, $arSocNetUserRelationsCache)) { $strSql = "SELECT 'x' ". "FROM b_sonet_user_relations UR ". "WHERE UR.FIRST_USER_ID = ".$firstUserID." ". " AND UR.SECOND_USER_ID = ".$secondUserID." ". " AND UR.RELATION = '".$DB->ForSql(SONET_RELATIONS_FRIEND, 1)."' ". "UNION ". "SELECT 'x' ". "FROM b_sonet_user_relations UR ". "WHERE UR.FIRST_USER_ID = ".$secondUserID." ". " AND UR.SECOND_USER_ID = ".$firstUserID." ". " AND UR.RELATION = '".$DB->ForSql(SONET_RELATIONS_FRIEND, 1)."' "; $dbResult = $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__); if ($dbResult->Fetch()) { $arSocNetUserRelationsCache[$firstUserID."_".$secondUserID] = true; } else { $arSocNetUserRelationsCache[$firstUserID."_".$secondUserID] = false; } } return $arSocNetUserRelationsCache[$firstUserID."_".$secondUserID]; } function IsFriends2($firstUserID, $secondUserID) { global $DB; static $arSocNetUser2RelationsCache = array(); $firstUserID = IntVal($firstUserID); if ($firstUserID <= 0) { return false; } $secondUserID = IntVal($secondUserID); if ($secondUserID <= 0) { return false; } if (!array_key_exists($firstUserID."_".$secondUserID, $arSocNetUser2RelationsCache)) { $strSql = "SELECT 'x' ". "FROM b_sonet_user_relations UR, b_sonet_user_relations UR1 ". "WHERE UR.FIRST_USER_ID = ".$firstUserID." ". " AND UR.SECOND_USER_ID = UR1.FIRST_USER_ID ". " AND UR.RELATION = '".$DB->ForSql(SONET_RELATIONS_FRIEND, 1)."' ". " AND UR1.SECOND_USER_ID = ".$secondUserID." ". " AND UR1.RELATION = '".$DB->ForSql(SONET_RELATIONS_FRIEND, 1)."' ". "UNION ". "SELECT 'x' ". "FROM b_sonet_user_relations UR, b_sonet_user_relations UR1 ". "WHERE UR.FIRST_USER_ID = ".$firstUserID." ". " AND UR.SECOND_USER_ID = UR1.SECOND_USER_ID ". " AND UR.RELATION = '".$DB->ForSql(SONET_RELATIONS_FRIEND, 1)."' ". " AND UR1.FIRST_USER_ID = ".$secondUserID." ". " AND UR1.RELATION = '".$DB->ForSql(SONET_RELATIONS_FRIEND, 1)."' ". "UNION ". "SELECT 'x' ". "FROM b_sonet_user_relations UR, b_sonet_user_relations UR1 ". "WHERE UR.SECOND_USER_ID = ".$firstUserID." ". " AND UR.FIRST_USER_ID = UR1.FIRST_USER_ID ". " AND UR.RELATION = '".$DB->ForSql(SONET_RELATIONS_FRIEND, 1)."' ". " AND UR1.SECOND_USER_ID = ".$secondUserID." ". " AND UR1.RELATION = '".$DB->ForSql(SONET_RELATIONS_FRIEND, 1)."' ". "UNION ". "SELECT 'x' ". "FROM b_sonet_user_relations UR, b_sonet_user_relations UR1 ". "WHERE UR.SECOND_USER_ID = ".$firstUserID." ". " AND UR.FIRST_USER_ID = UR1.SECOND_USER_ID ". " AND UR.RELATION = '".$DB->ForSql(SONET_RELATIONS_FRIEND, 1)."' ". " AND UR1.FIRST_USER_ID = ".$secondUserID." ". " AND UR1.RELATION = '".$DB->ForSql(SONET_RELATIONS_FRIEND, 1)."' "; $dbResult = $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__); if ($dbResult->Fetch()) { $arSocNetUser2RelationsCache[$firstUserID."_".$secondUserID] = true; } else { $arSocNetUser2RelationsCache[$firstUserID."_".$secondUserID] = false; } } return $arSocNetUser2RelationsCache[$firstUserID."_".$secondUserID]; } /***************************************/ /********** SEND EVENTS **************/ /***************************************/ function SendEvent($relationID, $mailType = "INVITE_FRIEND") { $relationID = IntVal($relationID); if ($relationID <= 0) return false; $dbRelation = CSocNetUserRelations::GetList( array(), array("ID" => $relationID), false, false, array("ID", "FIRST_USER_ID", "SECOND_USER_ID", "RELATION", "DATE_CREATE", "MESSAGE", "INITIATED_BY", "FIRST_USER_NAME", "FIRST_USER_LAST_NAME", "FIRST_USER_LOGIN", "FIRST_USER_EMAIL", "FIRST_USER_LID", "SECOND_USER_NAME", "SECOND_USER_LAST_NAME", "SECOND_USER_LOGIN", "SECOND_USER_EMAIL", "SECOND_USER_LID") ); $arRelation = $dbRelation->Fetch(); if (!$arRelation) return false; $fromUserPref = "FIRST"; $toUserPref = "SECOND"; if ($arRelation["INITIATED_BY"] == "S") { $fromUserPref = "SECOND"; $toUserPref = "FIRST"; } $mailTemplate = "SONET_INVITE_FRIEND"; if ($mailType == "AGREE_FRIEND") $mailTemplate = "SONET_AGREE_FRIEND"; elseif ($mailType == "BAN_FRIEND") $mailTemplate = "SONET_BAN_FRIEND"; $defSiteID = $arRelation[$toUserPref."_USER_LID"]; $siteID = CSocNetUserEvents::GetEventSite($arRelation[$toUserPref."_USER_ID"], $mailTemplate, $defSiteID); if ($siteID == false || StrLen($siteID) <= 0) return false; if (IsModuleInstalled("im")) { $url = str_replace("#USER_ID#", $arRelation[$toUserPref."_USER_ID"], COption::GetOptionString("socialnetwork", "user_request_page", (IsModuleInstalled("intranet")) ? "/company/personal/user/#USER_ID#/requests/" : "/club/user/#USER_ID#/requests/", $siteID)); } else $url = COption::GetOptionString("socialnetwork", "messages_path", "/company/personal/messages/", $siteID); $arFields = array( "RELATION_ID" => $relationID, "SENDER_USER_ID" => $arRelation[$fromUserPref."_USER_ID"], "SENDER_USER_NAME" => $arRelation[$fromUserPref."_USER_NAME"], "SENDER_USER_LAST_NAME" => $arRelation[$fromUserPref."_USER_LAST_NAME"], "SENDER_EMAIL_TO" => $arRelation[$fromUserPref."_USER_EMAIL"], "RECIPIENT_USER_ID" => $arRelation[$toUserPref."_USER_ID"], "RECIPIENT_USER_NAME" => $arRelation[$toUserPref."_USER_NAME"], "RECIPIENT_USER_LAST_NAME" => $arRelation[$toUserPref."_USER_LAST_NAME"], "RECIPIENT_USER_EMAIL_TO" => $arRelation[$toUserPref."_USER_EMAIL"], "MESSAGE" => $arRelation["MESSAGE"], "URL" => $url ); $event = new CEvent; $event->Send($mailTemplate, $siteID, $arFields, "N"); return true; } /***************************************/ /************ ACTIONS ****************/ /***************************************/ function SendRequestToBeFriend($senderUserID, $targetUserID, $message) { global $APPLICATION; $senderUserID = IntVal($senderUserID); if ($senderUserID <= 0) { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("SONET_UR_EMPTY_SENDER_USER_ID"), "ERROR_SENDER_USER_ID"); return false; } $targetUserID = IntVal($targetUserID); if ($targetUserID <= 0) { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("SONET_UR_EMPTY_TARGET_USER_ID"), "ERROR_TARGET_USER_ID"); return false; } $arFields = array( "FIRST_USER_ID" => $senderUserID, "SECOND_USER_ID" => $targetUserID, "RELATION" => SONET_RELATIONS_REQUEST, "=DATE_CREATE" => $GLOBALS["DB"]->CurrentTimeFunction(), "=DATE_UPDATE" => $GLOBALS["DB"]->CurrentTimeFunction(), "MESSAGE" => $message, "INITIATED_BY" => "F", ); //check if relation already exists to overwrite it //if user is banned but im is installed and black-list isn't used anymore $dbResult = CSocNetUserRelations::GetList( array(), array( "FIRST_USER_ID" => $senderUserID, "SECOND_USER_ID" => $targetUserID ) ); $ID = false; if ($arResult = $dbResult->GetNext()) { if ($arResult["RELATION"] == SONET_RELATIONS_BAN && IsModuleInstalled("im")) $ID = CSocNetUserRelations::Update($arResult["ID"], $arFields); } else $ID = CSocNetUserRelations::Add($arFields); if (!$ID) { $errorMessage = ""; if ($e = $APPLICATION->GetException()) $errorMessage = $e->GetString(); if (StrLen($errorMessage) <= 0) $errorMessage = GetMessage("SONET_UR_ERROR_CREATE_RELATION"); $GLOBALS["APPLICATION"]->ThrowException($errorMessage, "ERROR_CREATE_RELATION"); return false; } if (CModule::IncludeModule("im")) { $dbSenderUser = CUser::GetByID($senderUserID); $arSenderUser = $dbSenderUser->Fetch(); $senderUser = CUser::FormatName(CSite::GetNameFormat(), $arSenderUser, true); $arMessageFields = array( "MESSAGE_TYPE" => IM_MESSAGE_SYSTEM, "TO_USER_ID" => intval($targetUserID), "FROM_USER_ID" => intval($senderUserID), "NOTIFY_TYPE" => IM_NOTIFY_CONFIRM, "NOTIFY_MODULE" => "socialnetwork", "NOTIFY_EVENT" => "invite_user_btn", "NOTIFY_TAG" => "SOCNET|INVITE_USER|".intval($targetUserID)."|".intval($ID), "NOTIFY_TITLE" => str_replace("#USER#", $senderUser, GetMessage("SONET_U_INVITE_CONFIRM_TITLE")), "NOTIFY_MESSAGE" => str_replace("#TEXT#", $message, GetMessage("SONET_U_INVITE_CONFIRM_TEXT")), "NOTIFY_BUTTONS" => Array( Array('TITLE' => GetMessage('SONET_U_INVITE_CONFIRM'), 'VALUE' => 'Y', 'TYPE' => 'accept'), Array('TITLE' => GetMessage('SONET_U_INVITE_REJECT'), 'VALUE' => 'N', 'TYPE' => 'cancel'), ) ); $dbSite = CSite::GetByID(SITE_ID); $arSite = $dbSite->Fetch(); $serverName = htmlspecialcharsEx($arSite["SERVER_NAME"]); if (strlen($serverName) <= 0) { if (defined("SITE_SERVER_NAME") && strlen(SITE_SERVER_NAME) > 0) $serverName = SITE_SERVER_NAME; else $serverName = COption::GetOptionString("main", "server_name", ""); if (strlen($serverName) <=0) $serverName = $_SERVER["SERVER_NAME"]; } $serverName = (CMain::IsHTTPS() ? "https" : "http")."://".$serverName; $requestUrl = COption::GetOptionString("socialnetwork", "user_request_page", (IsModuleInstalled("intranet")) ? "/company/personal/user/#USER_ID#/requests/" : "/club/user/#USER_ID#/requests/", SITE_ID); $requestUrl = $serverName.str_replace(array("#USER_ID#", "#user_id#"), $targetUserID, $requestUrl); $arMessageFields['NOTIFY_MESSAGE_OUT'] = $arMessageFields['NOTIFY_MESSAGE']; $arMessageFields['NOTIFY_MESSAGE_OUT'] .= "\n\n".GetMessage('SONET_U_INVITE_CONFIRM').": ".$requestUrl.'?INVITE_USER='.$ID.'&CONFIRM=Y'; $arMessageFields['NOTIFY_MESSAGE_OUT'] .= "\n\n".GetMessage('SONET_U_INVITE_REJECT').": ".$requestUrl.'?INVITE_USER='.$ID.'&CONFIRM=N'; CIMNotify::Add($arMessageFields); } CSocNetUserRelations::__SpeedFileCreate($targetUserID); return true; } public static function ConfirmRequestToBeFriend($senderUserID, $relationID, $bAutoSubscribe = true) { global $APPLICATION; $senderUserID = IntVal($senderUserID); if ($senderUserID <= 0) { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("SONET_UR_EMPTY_SENDER_USER_ID"), "ERROR_SENDER_USER_ID"); return false; } $relationID = IntVal($relationID); if ($relationID <= 0) { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("SONET_UR_EMPTY_TARGET_USER_ID"), "ERROR_RELATION_ID"); return false; } $dbResult = CSocNetUserRelations::GetList( array(), array( "ID" => $relationID, "SECOND_USER_ID" => $senderUserID, "RELATION" => SONET_RELATIONS_REQUEST ), false, false, array("ID", "FIRST_USER_ID", "SECOND_USER_ID") ); if ($arResult = $dbResult->Fetch()) { $rsUser = CUser::GetByID(intval($arResult["FIRST_USER_ID"])); $arUser = $rsUser->Fetch(); if (!is_array($arUser) || $arUser["ACTIVE"] != "Y") { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("SONET_UR_INVALID_TARGET_USER_ID"), "ERROR_INVALID_TARGET_USER_ID"); return false; } $arFields = array( "RELATION" => SONET_RELATIONS_FRIEND, "=DATE_UPDATE" => $GLOBALS["DB"]->CurrentTimeFunction(), "INITIATED_BY" => "S", ); if (CSocNetUserRelations::Update($arResult["ID"], $arFields)) { if ($bAutoSubscribe) { CSocNetLogEvents::AutoSubscribe($senderUserID, SONET_ENTITY_USER, $arResult["FIRST_USER_ID"]); CSocNetLogEvents::AutoSubscribe($arResult["FIRST_USER_ID"], SONET_ENTITY_USER, $senderUserID); } if (CModule::IncludeModule("im")) { CIMNotify::DeleteByTag("SOCNET|INVITE_USER|".intval($senderUserID)."|".intval($arResult["ID"])); $arMessageFields = array( "MESSAGE_TYPE" => IM_MESSAGE_SYSTEM, "TO_USER_ID" => $arResult["FIRST_USER_ID"], "FROM_USER_ID" => $senderUserID, "NOTIFY_TYPE" => IM_NOTIFY_FROM, "NOTIFY_MODULE" => "socialnetwork", "NOTIFY_EVENT" => "inout_user", "NOTIFY_TAG" => "SOCNET|INVITE_USER_CONFIRM", "NOTIFY_MESSAGE" => GetMessage("SONET_UR_AGREE_FRIEND_MESSAGE"), ); CIMNotify::Add($arMessageFields); } } else { $errorMessage = ""; if ($e = $APPLICATION->GetException()) $errorMessage = $e->GetString(); if (StrLen($errorMessage) <= 0) $errorMessage = GetMessage("SONET_UR_ERROR_UPDATE_RELATION"); $GLOBALS["APPLICATION"]->ThrowException($errorMessage, "ERROR_CREATE_RELATION"); return false; } } else { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("SONET_UR_NO_FRIEND_REQUEST"), "ERROR_NO_FRIEND_REQUEST"); return false; } $arUserID = array( $arResult["FIRST_USER_ID"], $arResult["SECOND_USER_ID"] ); $dbFriends = CSocNetUserRelations::GetRelatedUsers($arResult["FIRST_USER_ID"], SONET_RELATIONS_FRIEND); while ($arFriends = $dbFriends->Fetch()) { $pref = (($arResult["FIRST_USER_ID"] == $arFriends["FIRST_USER_ID"]) ? "SECOND" : "FIRST"); $arUserID[] = $arResult[$pref."_USER_ID"]; } $dbFriends = CSocNetUserRelations::GetRelatedUsers($arResult["SECOND_USER_ID"], SONET_RELATIONS_FRIEND); while ($arFriends = $dbFriends->Fetch()) { $pref = (($arResult["FIRST_USER_ID"] == $arFriends["FIRST_USER_ID"]) ? "SECOND" : "FIRST"); $arUserID[] = $arResult[$pref."_USER_ID"]; } $arUserID = array_unique($arUserID); CSocNetUserRelations::__SpeedFileCheckMessages($senderUserID); return true; } public static function RejectRequestToBeFriend($senderUserID, $relationID) { global $APPLICATION; $senderUserID = IntVal($senderUserID); if ($senderUserID <= 0) { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("SONET_UR_EMPTY_SENDER_USER_ID"), "ERROR_SENDER_USER_ID"); return false; } $relationID = IntVal($relationID); if ($relationID <= 0) { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("SONET_UR_EMPTY_TARGET_USER_ID"), "ERROR_RELATION_ID"); return false; } $dbResult = CSocNetUserRelations::GetList( array(), array( "ID" => $relationID, "SECOND_USER_ID" => $senderUserID, "RELATION" => SONET_RELATIONS_REQUEST ), false, false, array("ID", "FIRST_USER_ID") ); if ($arResult = $dbResult->Fetch()) { if (CSocNetUserRelations::Delete($arResult["ID"])) { if (CModule::IncludeModule("im")) { CIMNotify::DeleteByTag("SOCNET|INVITE_USER|".intval($senderUserID)."|".intval($arResult["ID"])); $arMessageFields = array( "MESSAGE_TYPE" => IM_MESSAGE_SYSTEM, "TO_USER_ID" => $arResult["FIRST_USER_ID"], "FROM_USER_ID" => $senderUserID, "NOTIFY_TYPE" => IM_NOTIFY_FROM, "NOTIFY_MODULE" => "socialnetwork", "NOTIFY_EVENT" => "inout_user", "NOTIFY_TAG" => "SOCNET|INVITE_USER_REJECT", "NOTIFY_MESSAGE" => GetMessage("SONET_UR_REJECT_FRIEND_MESSAGE"), ); CIMNotify::Add($arMessageFields); } } else { $errorMessage = ""; if ($e = $APPLICATION->GetException()) $errorMessage = $e->GetString(); if (StrLen($errorMessage) <= 0) $errorMessage = GetMessage("SONET_UR_RELATION_DELETE_ERROR"); $GLOBALS["APPLICATION"]->ThrowException($errorMessage, "ERROR_DELETE_RELATION"); return false; } } else { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("SONET_UR_NO_FRIEND_REQUEST"), "ERROR_NO_FRIEND_REQUEST"); return false; } CSocNetUserRelations::__SpeedFileCheckMessages($senderUserID); return true; } function DeleteRelation($senderUserID, $targetUserID) { global $APPLICATION; $senderUserID = IntVal($senderUserID); if ($senderUserID <= 0) { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("SONET_UR_EMPTY_SENDER_USER_ID"), "ERROR_SENDER_USER_ID"); return false; } $targetUserID = IntVal($targetUserID); if ($targetUserID <= 0) { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("SONET_UR_EMPTY_TARGET_USER_ID"), "ERROR_TARGET_USER_ID"); return false; } $arRelation = CSocNetUserRelations::GetByUserID($senderUserID, $targetUserID); if (!$arRelation) { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("SONET_UR_RELATION_NOT_FOUND"), "ERROR_RELATION_NOT_FOUND"); return false; } if (CSocNetUserRelations::Delete($arRelation["ID"])) { if (CModule::IncludeModule("im")) { $rsUser = CUser::GetByID($senderUserID); if ($arUser = $rsUser->Fetch()) { switch ($arUser["PERSONAL_GENDER"]) { case "M": $gender_suffix = "_M"; break; case "F": $gender_suffix = "_F"; break; default: $gender_suffix = ""; } } $arMessageFields = array( "MESSAGE_TYPE" => IM_MESSAGE_SYSTEM, "FROM_USER_ID" => $senderUserID, "TO_USER_ID" => $targetUserID, "NOTIFY_TYPE" => IM_NOTIFY_FROM, "NOTIFY_MODULE" => "socialnetwork", "NOTIFY_EVENT" => "inout_user", "NOTIFY_TAG" => "SOCNET|FRIENDS|".intval($arRelation["ID"]), "NOTIFY_MESSAGE" => GetMessage("SONET_UR_IM_UNFRIEND".$gender_suffix), ); CIMNotify::Add($arMessageFields); } if ($arRelation["RELATION"] == SONET_RELATIONS_FRIEND) $GLOBALS["DB"]->Query("DELETE FROM b_sonet_event_user_view WHERE ENTITY_TYPE = '".SONET_ENTITY_USER."' AND ( (USER_ID = ".$arRelation["FIRST_USER_ID"]." AND ENTITY_ID = ".$arRelation["SECOND_USER_ID"].") OR (USER_ID = ".$arRelation["SECOND_USER_ID"]." AND ENTITY_ID = ".$arRelation["FIRST_USER_ID"].") OR (ENTITY_ID = ".$arRelation["FIRST_USER_ID"]." AND USER_IM_ID = ".$arRelation["SECOND_USER_ID"].") OR (ENTITY_ID = ".$arRelation["SECOND_USER_ID"]." AND USER_IM_ID = ".$arRelation["FIRST_USER_ID"].") OR (USER_ID = ".$arRelation["FIRST_USER_ID"]." AND USER_IM_ID = ".$arRelation["SECOND_USER_ID"].") OR (USER_ID = ".$arRelation["SECOND_USER_ID"]." AND USER_IM_ID = ".$arRelation["FIRST_USER_ID"].") )", true); } else { $errorMessage = ""; if ($e = $APPLICATION->GetException()) $errorMessage = $e->GetString(); if (StrLen($errorMessage) <= 0) $errorMessage = GetMessage("SONET_UR_RELATION_DELETE_ERROR"); $GLOBALS["APPLICATION"]->ThrowException($errorMessage, "ERROR_DELETE_RELATION"); return false; } CSocNetUserRelations::__SpeedFileCheckMessages($senderUserID); return true; } function BanUser($senderUserID, $targetUserID) { global $APPLICATION, $DB; $senderUserID = IntVal($senderUserID); if ($senderUserID <= 0) { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("SONET_UR_EMPTY_SENDER_USER_ID"), "ERROR_SENDER_USER_ID"); return false; } $targetUserID = IntVal($targetUserID); if ($targetUserID <= 0) { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("SONET_UR_EMPTY_TARGET_USER_ID"), "ERROR_TARGET_USER_ID"); return false; } elseif (CSocNetUser::IsUserModuleAdmin($targetUserID, false)) { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("SONET_UR_ERROR_CREATE_RELATION"), "ERROR_TARGET_USER_ID"); return false; } $strSql = "SELECT UR.ID, UR.FIRST_USER_ID, UR.SECOND_USER_ID, UR.RELATION ". "FROM b_sonet_user_relations UR ". "WHERE UR.FIRST_USER_ID = ".$senderUserID." ". " AND UR.SECOND_USER_ID = ".$targetUserID." ". "UNION ". "SELECT UR.ID, UR.FIRST_USER_ID, UR.SECOND_USER_ID, UR.RELATION ". "FROM b_sonet_user_relations UR ". "WHERE UR.FIRST_USER_ID = ".$targetUserID." ". " AND UR.SECOND_USER_ID = ".$senderUserID." "; $dbResult = $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__); if ($arResult = $dbResult->Fetch()) { if ($arResult["RELATION"] != SONET_RELATIONS_BAN) { $arFields = array( "RELATION" => SONET_RELATIONS_BAN, "=DATE_UPDATE" => $GLOBALS["DB"]->CurrentTimeFunction(), ); if ($arResult["FIRST_USER_ID"] == $senderUserID) $arFields["INITIATED_BY"] = "F"; else $arFields["INITIATED_BY"] = "S"; if (CSocNetUserRelations::Update($arResult["ID"], $arFields)) { $arMessageFields = array( "FROM_USER_ID" => $senderUserID, "TO_USER_ID" => $targetUserID, "MESSAGE" => GetMessage("SONET_UR_BANUSER_MESSAGE"), "=DATE_CREATE" => $GLOBALS["DB"]->CurrentTimeFunction(), "MESSAGE_TYPE" => SONET_MESSAGE_SYSTEM ); CSocNetMessages::Add($arMessageFields); if ($arResult["RELATION"] == SONET_RELATIONS_FRIEND) $GLOBALS["DB"]->Query("DELETE FROM b_sonet_event_user_view WHERE ENTITY_TYPE = '".SONET_ENTITY_USER."' AND ( (USER_ID = ".$arRelation["FIRST_USER_ID"]." AND ENTITY_ID = ".$arRelation["SECOND_USER_ID"].") OR (USER_ID = ".$arRelation["SECOND_USER_ID"]." AND ENTITY_ID = ".$arRelation["FIRST_USER_ID"].") OR (ENTITY_ID = ".$arRelation["FIRST_USER_ID"]." AND USER_IM_ID = ".$arRelation["SECOND_USER_ID"].") OR (ENTITY_ID = ".$arRelation["SECOND_USER_ID"]." AND USER_IM_ID = ".$arRelation["FIRST_USER_ID"].") OR (USER_ID = ".$arRelation["FIRST_USER_ID"]." AND USER_IM_ID = ".$arRelation["SECOND_USER_ID"].") OR (USER_ID = ".$arRelation["SECOND_USER_ID"]." AND USER_IM_ID = ".$arRelation["FIRST_USER_ID"].") )", true); } else { $errorMessage = ""; if ($e = $APPLICATION->GetException()) $errorMessage = $e->GetString(); if (StrLen($errorMessage) <= 0) $errorMessage = GetMessage("SONET_UR_ERROR_UPDATE_RELATION"); $GLOBALS["APPLICATION"]->ThrowException($errorMessage, "ERROR_UPDATE_RELATION"); return false; } } else { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("SONET_UR_ALREADY_BAN"), "ERROR_ALREADY_BAN"); return false; } } else { $arFields = array( "FIRST_USER_ID" => $senderUserID, "SECOND_USER_ID" => $targetUserID, "RELATION" => SONET_RELATIONS_BAN, "=DATE_CREATE" => $GLOBALS["DB"]->CurrentTimeFunction(), "=DATE_UPDATE" => $GLOBALS["DB"]->CurrentTimeFunction(), "INITIATED_BY" => "F", ); if (CSocNetUserRelations::Add($arFields)) { $arMessageFields = array( "FROM_USER_ID" => $senderUserID, "TO_USER_ID" => $targetUserID, "MESSAGE" => GetMessage("SONET_UR_BANUSER_MESSAGE"), "=DATE_CREATE" => $GLOBALS["DB"]->CurrentTimeFunction(), "MESSAGE_TYPE" => SONET_MESSAGE_SYSTEM ); CSocNetMessages::Add($arMessageFields); } else { $errorMessage = ""; if ($e = $APPLICATION->GetException()) $errorMessage = $e->GetString(); if (StrLen($errorMessage) <= 0) $errorMessage = GetMessage("SONET_UR_ERROR_CREATE_RELATION"); $GLOBALS["APPLICATION"]->ThrowException($errorMessage, "ERROR_CREATE_RELATION"); return false; } } return true; } function UnBanMember($senderUserID, $relationID) { global $APPLICATION, $DB; $senderUserID = IntVal($senderUserID); if ($senderUserID <= 0) { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("SONET_UR_EMPTY_SENDER_USER_ID"), "ERROR_SENDER_USER_ID"); return false; } $relationID = IntVal($relationID); if ($relationID <= 0) { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("SONET_UR_EMPTY_RELATION"), "ERROR_RELATIONID"); return false; } $arRelation = CSocNetUserRelations::GetByID($relationID); if (!$arRelation) { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("SONET_UR_ERROR_NO_RELATION"), "ERROR_NO_RELATION"); return false; } if ($arRelation["RELATION"] == SONET_RELATIONS_BAN && ($arRelation["FIRST_USER_ID"] == $senderUserID && $arRelation["INITIATED_BY"] == "F" || $arRelation["SECOND_USER_ID"] == $senderUserID && $arRelation["INITIATED_BY"] == "S")) { if (CSocNetUserRelations::Delete($arRelation["ID"])) { $arMessageFields = array( "FROM_USER_ID" => $senderUserID, "TO_USER_ID" => ($arRelation["FIRST_USER_ID"] == $senderUserID ? $arRelation["SECOND_USER_ID"] : $arRelation["FIRST_USER_ID"]), "MESSAGE" => GetMessage("SONET_UR_UNBANUSER_MESSAGE"), "=DATE_CREATE" => $GLOBALS["DB"]->CurrentTimeFunction(), "MESSAGE_TYPE" => SONET_MESSAGE_SYSTEM ); CSocNetMessages::Add($arMessageFields); } else { $errorMessage = ""; if ($e = $APPLICATION->GetException()) $errorMessage = $e->GetString(); if (StrLen($errorMessage) <= 0) $errorMessage = GetMessage("SONET_UR_RELATION_DELETE_ERROR"); $GLOBALS["APPLICATION"]->ThrowException($errorMessage, "ERROR_DELETE_RELATION"); return false; } } else { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("SONET_UR_UNBAN_ERROR"), "ERROR_UNBAN"); return false; } return true; } function __SpeedFileCheckMessages($userID) { $userID = IntVal($userID); if ($userID <= 0) return; $cnt = 0; $dbResult = $GLOBALS["DB"]->Query( "SELECT COUNT(ID) as CNT ". "FROM b_sonet_user_relations ". "WHERE SECOND_USER_ID = ".$userID." ". " AND RELATION = '".$GLOBALS["DB"]->ForSql(SONET_RELATIONS_REQUEST, 1)."' " ); if ($arResult = $dbResult->Fetch()) $cnt = IntVal($arResult["CNT"]); if ($cnt > 0) CSocNetUserRelations::__SpeedFileCreate($userID); else CSocNetUserRelations::__SpeedFileDelete($userID); } function __SpeedFileCreate($userID) { global $CACHE_MANAGER; $userID = IntVal($userID); if ($userID <= 0) return; if ($CACHE_MANAGER->Read(86400*30, "socnet_cf_".$userID)) $CACHE_MANAGER->Clean("socnet_cf_".$userID); /* $filePath = $_SERVER["DOCUMENT_ROOT"].BX_PERSONAL_ROOT."/managed_flags/socnet/c/".IntVal($userID / 1000)."/"; $fileName = $userID."_f"; if (!file_exists($filePath.$fileName)) { CheckDirPath($filePath); @fclose(@fopen($filePath.$fileName, "w")); } */ } function __SpeedFileDelete($userID) { global $CACHE_MANAGER; $userID = IntVal($userID); if ($userID <= 0) return; if (!$CACHE_MANAGER->Read(86400*30, "socnet_cf_".$userID)) $CACHE_MANAGER->Set("socnet_cf_".$userID, true); /* $fileName = $_SERVER["DOCUMENT_ROOT"].BX_PERSONAL_ROOT."/managed_flags/socnet/c/".IntVal($userID / 1000)."/".$userID."_f"; if (file_exists($fileName)) @unlink($fileName); */ } function SpeedFileExists($userID) { global $CACHE_MANAGER; $userID = IntVal($userID); if ($userID <= 0) return; return (!$CACHE_MANAGER->Read(86400*30, "socnet_cf_".$userID)); /* $fileName = $_SERVER["DOCUMENT_ROOT"].BX_PERSONAL_ROOT."/managed_flags/socnet/c/".IntVal($userID / 1000)."/".$userID."_f"; return file_exists($fileName); */ } /* Module IM callback */ function OnBeforeConfirmNotify($module, $tag, $value, $arParams) { if ($module == "socialnetwork") { $arTag = explode("|", $tag); if (count($arTag) == 4 && $arTag[1] == 'INVITE_USER') { if ($value == 'Y') { self::ConfirmRequestToBeFriend($arTag[2], $arTag[3]); return true; } else { self::RejectRequestToBeFriend($arTag[2], $arTag[3]); return true; } } } } } ?>