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/Pin/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

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

namespace Bitrix\Im\V2\Link\Pin;

use Bitrix\Im\Dialog;
use Bitrix\Im\Model\LinkPinTable;
use Bitrix\Im\Services\MessageParam;
use Bitrix\Im\V2\Chat;
use Bitrix\Im\V2\Common\ContextCustomer;
use Bitrix\Im\V2\Error;
use Bitrix\Im\V2\Link\Push;
use Bitrix\Im\V2\Message;
use Bitrix\Im\V2\MessageCollection;
use Bitrix\Im\V2\Result;
use Bitrix\Main\Localization\Loc;
use Bitrix\Main\ORM\Query\Query;
use Bitrix\Im\V2\Sync;

class PinService
{
	use ContextCustomer;

	public const ADD_PIN_EVENT = 'pinAdd';
	public const DELETE_PIN_EVENT = 'pinDelete';

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

		$pin = PinItem::createFromMessage($message, $this->getContext());
		$saveResult = $this->savePin($pin);

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

		$saveParamResult = $this->saveInParam($message);

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

		$chat = Chat::getInstance($pin->getChatId());
		Sync\Logger::getInstance()->add(
			new Sync\Event(Sync\Event::ADD_EVENT, Sync\Event::PIN_MESSAGE_ENTITY, $pin->getId()),
			fn () => $chat->getRelations()->getUserIds(),
			$chat
		);

		$this->sendMessageAboutPin($pin);

		Push::getInstance()
			->setContext($this->context)
			->sendFull($pin, static::ADD_PIN_EVENT, ['CHAT_ID' => $pin->getChatId()])
		;

		return $result;
	}

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

		$pin = PinItem::getByMessage($message);

		if ($pin === null)
		{
			return $result;
		}

		$deleteResult = $pin->delete();

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

		$deleteParamResult = $this->deleteFromParam($message);

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

		$chat = Chat::getInstance($pin->getChatId());
		Sync\Logger::getInstance()->add(
			new Sync\Event(Sync\Event::DELETE_EVENT, Sync\Event::PIN_MESSAGE_ENTITY, $pin->getId()),
			fn () => $chat->getRelations()->getUserIds(),
			$chat
		);

		Push::getInstance()
			->setContext($this->context)
			->sendIdOnly($pin, static::DELETE_PIN_EVENT, ['CHAT_ID' => $pin->getChatId()])
		;

		return $result;
	}

	public function unpinMessages(MessageCollection $messages, bool $clearParams = true): Result
	{
		$result = new Result();

		$pinCollection = PinCollection::getByMessages($messages);

		if ($pinCollection->count() === 0)
		{
			return $result;
		}

		$deleteResult = $pinCollection->delete();

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

		if ($clearParams)
		{
			$deleteParamResult = $this->deleteFromParams($messages);

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


		$chat = Chat::getInstance($pinCollection->getRelatedChatId());

		/** @var PinItem $pin */
		foreach ($pinCollection as $pin)
		{
			Sync\Logger::getInstance()->add(
				new Sync\Event(Sync\Event::DELETE_EVENT, Sync\Event::PIN_MESSAGE_ENTITY, $pin->getId()),
				fn () => $chat->getRelations()->getUserIds(),
				$chat
			);

			Push::getInstance()
				->setContext($this->context)
				->sendIdOnly($pin, static::DELETE_PIN_EVENT, ['CHAT_ID' => $pin->getChatId()])
			;
		}

		return $result;
	}

	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 LinkPinTable::getCount($filter);
	}

	protected function savePin(PinItem $pin): Result
	{
		try
		{
			return $pin->save();
		}
		catch (\Bitrix\Main\SystemException $exception)
		{
			return (new Result())->addError(new Message\MessageError(Message\MessageError::MESSAGE_IS_ALREADY_PIN));
		}
	}

	protected function saveInParam(Message $message): Result
	{
		//todo replace this with new api
		\CIMMessageParam::Set($message->getMessageId(), ['IS_PINNED' => 'Y']);
		\CIMMessageParam::SendPull($message->getMessageId(), ['IS_PINNED']);

		return new Result();
	}

	protected function deleteFromParam(Message $message): Result
	{
		//todo replace this with new api
		\CIMMessageParam::Set($message->getMessageId(), ['IS_PINNED' => 'N']);
		\CIMMessageParam::SendPull($message->getMessageId(), ['IS_PINNED']);

		return new Result();
	}

	protected function deleteFromParams(MessageCollection $messages): Result
	{
		$pushService = new Message\Param\PushService();
		foreach ($messages as $message)
		{
			$message->getParams(true)->load([Message\Params::IS_PINNED => 'N']);
			$pushService->sendPull($message, ['IS_PINNED']);
		}

		return new Result();
	}

	protected function sendMessageAboutPin(PinItem $pin): Result
	{
		//todo: Replace with new API
		$dialogId = Dialog::getDialogId($pin->getChatId());
		$authorId = $this->getContext()->getUserId();

		$messageId = \CIMChat::AddMessage([
			'DIALOG_ID' => $dialogId,
			'SYSTEM' => 'Y',
			'MESSAGE' => $this->getMessageText($pin),
			'FROM_USER_ID' => $authorId,
			'PARAMS' => [
				'CLASS' => 'bx-messenger-content-item-system',
				'BETA' => 'Y'
			],
			'URL_PREVIEW' => 'N',
			'SKIP_CONNECTOR' => 'Y',
			'SKIP_COMMAND' => 'Y',
			'SILENT_CONNECTOR' => 'Y',
		]);

		$result = new Result();

		if ($messageId === false)
		{
			return $result->addError(new Error(''));
		}

		return $result;
	}

	protected function getMessageText(PinItem $pin): string
	{
		if (Chat::getInstance($pin->getChatId()) instanceof Chat\ChannelChat)
		{
			$type = 'CHANNEL';
			$versionPostfix = '';
		}
		else
		{
			$type = 'CHAT';
			$versionPostfix = '_MSGVER_1';
		}

		$genderModifier = ($this->getContext()->getUser()->getGender() === 'F') ? '_F' : '';
		$text = (new Message($pin->getMessageId()))->getQuotedMessage() . "\n";
		$text .= Loc::getMessage(
			"IM_{$type}_PIN_ADD_NOTIFICATION" . $genderModifier . $versionPostfix,
			[
				'#MESSAGE_ID#' => $pin->getMessageId(),
				'#USER_ID#' => $this->getContext()->getUserId(),
				'#DIALOG_ID#' => Chat::getInstance($pin->getChatId())->getDialogContextId(),
			]
		);

		return $text;
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit