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/ilovecveti.ru/bitrix/modules/calendar/lib/sync/google/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/ilovecveti.ru/bitrix/modules/calendar/lib/sync/google/eventconverter.php
<?php

namespace Bitrix\Calendar\Sync\Google;

use Bitrix\Calendar\Core\Base\BaseException;
use Bitrix\Calendar\Core\Base\Date;
use Bitrix\Calendar\Core\Event\Event;
use Bitrix\Calendar\Core\Event\Properties\RecurringEventRules;
use Bitrix\Calendar\Core\Event\Properties\Remind;
use Bitrix\Calendar\Sync\Connection\EventConnection;
use Bitrix\Calendar\Sync\Entities\InstanceMap;
use Bitrix\Calendar\Sync\Entities\SyncEvent;
use Bitrix\Calendar\Sync\Util\EventDescription;

class EventConverter
{
	protected const MAX_COUNT_REMINDERS_FOR_SYNC = 5;

	/**
	 * @var InstanceMap|null
	 */
	protected ?InstanceMap $instanceCollection;
	/**
	 * @var Event
	 */
	private Event $originalEvent;
	/**
	 * @var EventConnection|null
	 */
	private ?EventConnection $eventConnection;

	/**
	 * @param Event $event
	 * @param EventConnection|null $eventConnection
	 * @param InstanceMap|null $instanceCollection
	 */
	public function __construct(
		Event $event,
		?EventConnection $eventConnection = null,
		?InstanceMap $instanceCollection = null
	)
	{
		$this->originalEvent = $event;
		$this->eventConnection = $eventConnection;
		$this->instanceCollection = $instanceCollection;
	}

	/**
	 * @return array
	 * @throws \Bitrix\Main\ObjectException
	 */
	public function convertForCreate(): array
	{
		$event = [];

		$event['summary'] = $this->originalEvent->getName();
		$event['description'] = $this->prepareDescription($this->originalEvent);
		$event['transparency'] = $this->prepareAccessibility();
		$event = array_merge($event, $this->prepareDate());
		$event['reminders'] = $this->prepareReminders();
		$event['location'] = $this->prepareLocation();
		$event['visibility'] = $this->prepareVisibility();
		// $event['sequence'] = $this->originalEvent->getVersion() - Helper::VERSION_DIFFERENCE;

		if ($this->originalEvent->getUid() !== null)
		{
			$event['iCalUID'] = $this->originalEvent->getUid();
		}

		if ($this->originalEvent->isRecurrence())
		{
			$event['recurrence'] = $this->prepareRecurrenceRule();
		}

		return $event;
	}

	/**
	 * @param Event $event
	 * @return string
	 * @throws \Bitrix\Main\ArgumentException
	 * @throws \Bitrix\Main\ObjectPropertyException
	 * @throws \Bitrix\Main\SystemException
	 */
	private function prepareDescription(Event $event): string
	{
		$description = \CCalendarEvent::ParseText((new EventDescription())->prepareForExport($event));

		return preg_replace("/<br>/i", "\r\n", $description);
	}

	/**
	 * @throws \Bitrix\Main\ObjectException
	 * @throws BaseException
	 */
	public function convertForUpdate(): array
	{
		if ($this->eventConnection === null)
		{
			throw new BaseException('you should initialize eventConnection before update event');
		}

		$event = $this->convertForCreate();
		if ($this->eventConnection && $this->eventConnection->getVendorEventId() !== null)
		{
			$event['id'] = $this->eventConnection->getVendorEventId();

			if ($this->originalEvent->isInstance())
			{
				$event['recurringEventId'] = $this->eventConnection->getRecurrenceId();
			}
		}

		$this->eventConnection->setData($this->eventConnection->fetchData());

		if (($eventConnectionData = $this->eventConnection->getData()) && !empty($eventConnectionData['attendees']))
		{
			$event['attendees'] = $eventConnectionData['attendees'];
		}

		return $event;
	}

	/**
	 * @return array
	 * @throws BaseException
	 * @throws \Bitrix\Main\ObjectException
	 */
	public function convertForDeleteInstance(): array
	{
		$event = $this->convertForUpdate();
		$event['status'] = 'cancelled';

		return $event;
	}

	/**
	 * @return string
	 */
	public function prepareAccessibility(): string
	{
		return $this->originalEvent->getAccessibility() === 'busy'
			? 'opaque'
			: 'transparent'
		;
	}

	/**
	 * @return array
	 */
	public function prepareDate(): array
	{
		$date = [];

		if ($this->originalEvent->isFullDayEvent())
		{
			$date['start']['date'] = $this->originalEvent->getStart()->format('Y-m-d');
			$date['end']['date'] = $this->originalEvent->getEnd()->add(('+1 day'))->format('Y-m-d');
		}
		else
		{
			$date['start']['dateTime'] = $this->originalEvent->getStart()->format(Helper::DATE_TIME_FORMAT);
			$date['start']['timeZone'] = $this->originalEvent->getStartTimeZone()
				? $this->originalEvent->getStartTimeZone()->getTimeZone()->getName()
				: (new \DateTime())->getTimezone()->getName()
			;
			$date['end']['dateTime'] = $this->originalEvent->getEnd()->format(Helper::DATE_TIME_FORMAT);
			$date['end']['timeZone'] = $this->originalEvent->getEndTimeZone()
				? $this->originalEvent->getEndTimeZone()->getTimeZone()->getName()
				: (new \DateTime())->getTimezone()->getName()
			;
		}

		if ($this->originalEvent->getOriginalDateFrom() !== null)
		{
			if ($this->originalEvent->isFullDayEvent())
			{
				$event['originalStartTime']['date'] = $this->originalEvent->getOriginalDateFrom()->format(Helper::DATE_FORMAT);
			}
			else
			{
				$event['originalStartTime']['dateTime'] = $this->originalEvent->getOriginalDateFrom()->format(Helper::DATE_TIME_FORMAT);
			}
		}

		return $date;
	}

	/**
	 * @return array
	 */
	private function prepareReminders(): array
	{
		$reminders = [];
		$reminders['useDefault'] = false;

		$remindCollection = $this->originalEvent->getRemindCollection();
		if ($remindCollection && $remindCollection->count() > self::MAX_COUNT_REMINDERS_FOR_SYNC)
		{
			$remindCollection->sortFromStartEvent();
		}

		/** @var Remind $remind */
		foreach ($remindCollection as $remind)
		{
			if (!$remind->isBeforeEventStart())
			{
				continue;
			}

			$reminders['overrides'][] = [
				Remind::UNIT_MINUTES => $remind->getTimeBeforeStartInMinutes(),
				'method' => 'popup',
			];

			if (count($reminders['overrides']) >= self::MAX_COUNT_REMINDERS_FOR_SYNC)
			{
				break;
			}
		}

		return $reminders;
	}

	/**
	 * @return string
	 * @throws \Bitrix\Main\ArgumentException
	 * @throws \Bitrix\Main\ObjectPropertyException
	 * @throws \Bitrix\Main\SystemException
	 */
	private function prepareLocation(): string
	{
		if ($this->originalEvent->getLocation())
		{
			return \Bitrix\Calendar\Rooms\Util::getTextLocation((string)$this->originalEvent->getLocation());
		}

		return '';
	}

	/**
	 * @return string
	 */
	private function prepareVisibility(): string
	{
		return $this->originalEvent->isPrivate()
			? 'private'
			: 'public'
		;
	}

	/**
	 * @return array
	 */
	private function prepareRecurrenceRule(): array
	{
		$rule = [];

		if (!$this->originalEvent->isRecurrence())
		{
			return [];
		}

		$rule[] = $this->prepareDescriptionRecurrenceRule();

		if ($this->originalEvent->getExcludedDateCollection() !== null)
		{
			array_push($rule, ...$this->prepareExcludedDates());
		}

		return $rule;
	}

	/**
	 * @return string
	 */
	public function prepareDescriptionRecurrenceRule(): string
	{
		/** @var RecurringEventRules $eventRule */
		$eventRule = $this->originalEvent->getRecurringRule();
		$descriptionRule = 'RRULE:';
		$descriptionRule .= 'FREQ=' . $eventRule->getFrequency();
		$descriptionRule .= ';INTERVAL=' . $eventRule->getInterval();

		if ($eventRule->hasDay())
		{
			$descriptionRule .= ';BYDAY=' . implode(",", $eventRule->getByday());
		}

		if ($eventRule->hasCount())
		{
			$descriptionRule .= ';COUNT=' . $eventRule->getCount();
		}
		elseif ($eventRule->hasUntil())
		{
			$until = clone $eventRule->getUntil();
			if (!$this->originalEvent->isFullDayEvent() && !$eventRule->isUntilEndOfTime())
			{
				$until = $until->add('1 day')->sub('1 second');
			}
			$descriptionRule .= ';UNTIL=' . $until->format(Helper::DATE_TIME_FORMAT_WITH_UTC_TIMEZONE);
		}

		return $descriptionRule;
	}

	/**
	 * @return array
	 */
	public function prepareExcludedDates(): array
	{
		$rule = [];

		if (
			$this->originalEvent->getExcludedDateCollection()
			&& ($exdateCollection = $this->originalEvent->getExcludedDateCollection()->getDateCollectionNewerThanInterval())
		)
		{
			$originalDateList = [];
			if ($this->instanceCollection !== null)
			{
				/** @var SyncEvent $instance */
				foreach ($this->instanceCollection as $instance)
				{
					if ($originalDateFrom = $instance->getEvent()->getOriginalDateFrom())
					{
						$originalDateList[] = $originalDateFrom->format('Ymd');
					}
				}
			}

			if ($this->originalEvent->isFullDayEvent())
			{
				foreach ($exdateCollection as $exDate)
				{
					$date = $exDate->format('Ymd');
					if (!in_array($date, $originalDateList, true))
					{
						$rule[] = 'EXDATE;VALUE=DATE:' . $date;
					}
				}
			}
			else
			{
				$postfix = (clone $this->originalEvent->getStart())
					->setTimezone(new \DateTimeZone('UTC'))
					->format('\\THis\\Z')
				;
				/** @var Date $exDate */
				foreach ($exdateCollection as $exDate)
				{
					$date = $exDate->format('Ymd');
					if (!in_array($date, $originalDateList, true))
					{
						$rule[] = 'EXDATE;TZID=UTC:' . $date . $postfix;
					}
				}
			}
		}

		return $rule;
	}

	/**
	 * @return string[]
	 */
	public function convertForDelete(): array
	{
		return [
			'sendUpdates' => 'all',
		];
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit