403Webshell
Server IP : 80.87.202.40  /  Your IP : 216.73.216.169
Web Server : Apache
System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64
User : bitrix ( 600)
PHP Version : 8.2.27
Disable Function : NONE
MySQL : OFF |  cURL : ON |  WGET : ON |  Perl : ON |  Python : OFF |  Sudo : ON |  Pkexec : ON
Directory :  /home/bitrix/ext_www/rospirotorg.ru/bitrix/modules/im/lib/V2/Link/Url/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/rospirotorg.ru/bitrix/modules/im/lib/V2/Link/Url/UrlService.php
<?php

namespace Bitrix\Im\V2\Link\Url;

use Bitrix\Im\Model\LinkUrlTable;
use Bitrix\Im\V2\Common\ContextCustomer;
use Bitrix\Im\V2\Link\Push;
use Bitrix\Im\V2\Message;
use Bitrix\Im\V2\MessageCollection;
use Bitrix\Im\V2\Result;
use Bitrix\Main\Application;
use Bitrix\Main\ORM\Query\Query;

class UrlService
{
	use ContextCustomer;

	protected const ADD_URL_EVENT = 'urlAdd';
	protected const DELETE_URL_EVENT = 'urlDelete';

	private bool $isBackgroundMode = true;
	private int $quotaOfFetchMetadata = 5;

	public function getCount(int $chatId, ?int $startId = null): int
	{
		$filter = Query::filter()->where('CHAT_ID', $chatId);

		if (isset($startId) && $startId > 0)
		{
			$filter->where('MESSAGE_ID', '>=', $startId);
		}

		return LinkUrlTable::getCount($filter);
	}

	/**
	 * @param Message $message
	 * @return Result
	 */
	public function saveUrlsFromMessage(Message $message): Result
	{
		if ($this->isBackgroundMode)
		{
			Application::getInstance()->addBackgroundJob(fn () => $this->saveUrlsFromMessageInternal($message));

			return new Result();
		}

		return $this->saveUrlsFromMessageInternal($message);
	}

	/**
	 * @param Message $message
	 * @return Result
	 */
	public function updateUrlsFromMessage(Message $message): Result
	{
		$result = new Result();

		$deleteResult = $this->deleteUrlsByMessage($message);

		if (!$deleteResult->isSuccess())
		{
			return $result->addErrors($deleteResult->getErrors());
		}

		$saveResult = $this->saveUrlsFromMessage($message);

		if (!$saveResult->isSuccess())
		{
			return $result->addErrors($saveResult->getErrors());
		}

		return $result;
	}

	public function deleteUrlsByMessage(Message $message): Result
	{
		$result = new Result();

		$urls = $this->getUrlsByMessage($message);

		if (count($urls) === 0)
		{
			return $result;
		}

		return $this->deleteUrls($urls);
	}

	public function deleteUrlsByMessages(MessageCollection $messages): Result
	{
		$result = new Result();

		$urls = $this->getUrlsByMessages($messages);

		if (count($urls) === 0)
		{
			return $result;
		}

		return $this->deleteUrls($urls);
	}

	public function deleteUrls(UrlCollection $urls): Result
	{
		$deleteResult = $urls->delete();

		if (!$deleteResult->isSuccess())
		{
			return $deleteResult;
		}

		foreach ($urls as $url)
		{
			Push::getInstance()
				->setContext($this->context)
				->sendIdOnly($url, UrlService::DELETE_URL_EVENT, ['CHAT_ID' => $url->getChatId()])
			;
		}

		return $deleteResult;
	}

	public function setBackgroundMode(bool $isBackgroundMode): self
	{
		$this->isBackgroundMode = $isBackgroundMode;

		return $this;
	}

	public function setQuotaOfFetchMetadata(int $quota): self
	{
		$this->quotaOfFetchMetadata = $quota;

		return $this;
	}

	protected function saveUrlsFromMessageInternal(Message $message): Result
	{
		$result = new Result();
		$urlCollection = $this->initUrlsByMessage($message);

		if ($urlCollection->hasUnsaved())
		{
			$saveResult = $this->saveUrls($urlCollection);
			if ($saveResult->isSuccess())
			{
				$this->sendAddPush($urlCollection);
			}
			else
			{
				$result->addErrors($saveResult->getErrors());
			}
		}

		return $result;
	}

	protected function saveUrls(UrlCollection $urls): Result
	{
		return $urls->save();
	}

	protected function getUrlsByMessage(Message $message): UrlCollection
	{
		$urlEntities = LinkUrlTable::query()
			->setSelect(['*'])
			->where('MESSAGE_ID', $message->getMessageId())
			->fetchCollection();

		return (new UrlCollection($urlEntities))->fillMetadata();
	}

	protected function getUrlsByMessages(MessageCollection $messages): UrlCollection
	{
		$urlEntities = LinkUrlTable::query()
			->setSelect(['*'])
			->whereIn('MESSAGE_ID', $messages->getIds())
			->fetchCollection();
		return (new UrlCollection($urlEntities));
	}

	protected function initUrlsByMessage(Message $message): UrlCollection
	{
		$urls = \Bitrix\Im\V2\Entity\Url\UrlItem::getUrlsFromText($message->getMessage());
		$urlCollection = new \Bitrix\Im\V2\Entity\Url\UrlCollection();
		$countUrlsWithMetadata = 0;

		foreach ($urls as $url)
		{
			$withFetchMetadata = $countUrlsWithMetadata < $this->quotaOfFetchMetadata;
			$urlCollection[] = new \Bitrix\Im\V2\Entity\Url\UrlItem($url, $withFetchMetadata);
			$countUrlsWithMetadata++;
		}

		return UrlCollection::linkEntityToMessage($urlCollection, $message);
	}

	protected function sendAddPush(UrlCollection $urls): void
	{
		foreach ($urls as $url)
		{
			$recipient = $url->getEntity()->getRichData()->getAllowedUsers();
			if ($recipient === null)
			{
				Push::getInstance()
					->setContext($this->context)
					->sendFull($url, self::ADD_URL_EVENT, ['CHAT_ID' => $url->getChatId()])
				;
			}
			else
			{
				Push::getInstance()
					->setContext($this->context)
					->sendFull($url, self::ADD_URL_EVENT, ['RECIPIENT' => $recipient])
				;
			}
		}
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit