3namespace Bitrix\Im\V2\Recent;
5use Bitrix\Im\Model\RecentTable;
6use Bitrix\Im\V2\Common\PeriodAgentTrait;
7use Bitrix\Im\V2\Entity\User\User;
8use Bitrix\Im\V2\Entity\User\UserCollection;
9use Bitrix\Im\V2\Logger;
10use Bitrix\Im\V2\Recent\Initializer\BaseSource;
11use Bitrix\Im\V2\Recent\Initializer\InitialiazerResult;
12use Bitrix\Im\V2\Recent\Initializer\Queue\DequeueResult;
13use Bitrix\Im\V2\Recent\Initializer\Queue\QueueItem;
14use Bitrix\Im\V2\Recent\Initializer\QueueService;
15use Bitrix\Im\V2\Recent\Initializer\Source;
16use Bitrix\Im\V2\Recent\Initializer\SourceType;
17use Bitrix\Im\V2\Result;
27 private const INSERT_PARAMS = [
'DEADLOCK_SAFE' =>
true,
'UNIQUE_FIELDS' => [
'USER_ID',
'ITEM_TYPE',
'ITEM_ID']];
44 $instanceKey =
"{$queueItem->userId}_{$queueItem->stageType->value}_{$queueItem->sourceType->value}_{$queueItem->sourceId}";
45 if (isset(self::$instances[$instanceKey]))
47 return self::$instances[$instanceKey];
52 self::$instances[$instanceKey] =
new static($queueItem->userId,
$source);
54 return self::$instances[$instanceKey];
59 return self::addMulti($users, SourceType::Collab, $chatCollabId);
69 while (!self::isLimitsExceeded())
71 $result = self::executeAgentIteration();
78 $queueItem =
$result->getQueueItem();
83 self::calculateAndSetPeriod(
true);
85 return self::getAgentName();
95 return $dequeueResult->setHasMore(
false);
100 $result = static::doSteps($queueItem);
101 $queueItem =
$result->getQueueItem();
103 return $dequeueResult->setQueueItem($queueItem?->unlock());
105 catch (\Throwable $exception)
107 (
new Logger(
'imRecentInitializer'))->logThrowable($exception);
109 return $dequeueResult->setQueueItem($queueItem->unlock());
117 while (!self::isLimitsExceeded())
124 $initializer = static::getInstance($queueItem);
125 $result = $initializer->doStep($queueItem);
126 $queueItem =
$result->getQueueItem();
134 $result = $this->source->getItems($queueItem->pointer, self::SELECTED_ITEM_LIMIT);
142 $this->source->getStage()->sendPullAfterInsert(
$items);
146 return $result->setQueueItem($queueItem);
151 $users = self::filterInvitedUsers($users);
152 $lastQueueItem =
null;
154 foreach ($users as
$user)
156 if (!self::isLimitsExceeded())
158 $firstStep = QueueItem::createFirstStep(
$user, $sourceType, $sourceId);
160 $lastQueueItem =
$result->getQueueItem();
164 $queueItems[] = QueueItem::createFirstStep(
$user, $sourceType, $sourceId);
170 array_unshift($queueItems, $lastQueueItem);
173 if (!empty($queueItems))
178 self::calculateAndSetPeriod(
false);
192 $queueItem =
$result->getQueueItem();
194 self::calculateAndSetPeriod(
false);
196 return $result->setQueueItem($queueItem);
208 $nextStage = $queueItem->stageType->getNext();
209 if ($nextStage ===
null)
229 self::$insertedItemLimitCounter +=
count(
$result->getItems());
230 self::$selectedItemLimitCounter +=
$result->getSelectedItemsCount();
236 self::$selectedItemLimitCounter >= self::SELECTED_ITEM_LIMIT
237 || self::$insertedItemLimitCounter >= self::INSERTED_ITEM_LIMIT
244 $userCollection->fillOnlineData();
246 return array_filter($users,
static fn (
int $userId) => !self::isUserInvited(
$userId));
256 RecentTable::multiplyInsertWithoutDuplicate(
$fields, self::INSERT_PARAMS);
261 return '\Bitrix\Im\V2\Recent\Initializer::executeAgent();';
266 self::setPeriodByName($fromAgent, self::getAgentName(), self::getNewAgentPeriodGetter());
276 return $newPeriod === self::AGENT_SHORT_PERIOD;
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
static getInstance($userId=null)
static createFromQueueItem(QueueItem $queueItem)
updatePointer(string $pointer, ?StageType $stage=null)
static addMulti(array $users, SourceType $sourceType, ?int $sourceId=null)
finalize(QueueItem $queueItem)
updateQueueItem(QueueItem $queueItem, InitialiazerResult $result)
const SELECTED_ITEM_LIMIT
const INSERTED_ITEM_LIMIT
static isUserInvited(int $userId)
static int $insertedItemLimitCounter
static executeAgentIteration()
static isLimitsExceeded()
static getInstance(QueueItem $queueItem)
static doSteps(QueueItem $queueItem)
static calculateAndSetPeriod(bool $fromAgent)
incrementLimitCounters(InitialiazerResult $result)
static onAfterUsersAddToCollab(array $users, int $chatCollabId)
static onAfterUserAcceptInvite(int $userId)
static isAgentPeriodShort(int $newPeriod)
static add(int $targetId, SourceType $sourceType, ?int $sourceId=null, bool $isFirstInit=false)
static filterInvitedUsers(array $users)
static getNewAgentPeriodGetter()
static int $selectedItemLimitCounter
__construct(int $targetId, Source $source)
doStep(QueueItem $queueItem)
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
if($ar_profile["DEFAULT_PROFILE"] !='Y') $firstStep
</p ></td >< td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 2.0pt 0cm 2.0pt;height:9.0pt'>< p class=Normal align=center style='margin:0cm;margin-bottom:.0001pt;text-align:center;line-height:normal'>< a name=ТекстовоеПоле54 ></a ><?=($taxRate > count( $arTaxList) > 0) ? $taxRate."%"