23 Chat::IM_TYPE_OPEN_LINE,
24 Chat::IM_TYPE_COMMENT,
27 private static Logger $instance;
29 private bool $isAlreadyPlanned =
false;
30 private array $events = [];
31 private ?
array $allowedUsers =
null;
33 private function __construct()
39 self::$instance ??=
new Logger();
41 return self::$instance;
56 $userId ??= $this->getContext()->getUserId();
59 if (!$this->isAlreadyPlanned)
62 $this->isAlreadyPlanned =
true;
75 (
new static())->
clean();
77 return __METHOD__ .
'();';
83 LogTable::deleteByFilter([
'<=DATE_DELETE' => $now]);
101 if (in_array($chat->
getType(), self::CHAT_TYPE_BLACKLIST,
true))
106 return !empty($chat->getRecentSections());
109 private function addDeferred(): void
116 $this->runClosureInEvents();
117 $groupedEvents = $this->getGroupedEvents();
119 foreach ($groupedEvents as [
'event' =>
$event,
'user' =>
$userId])
121 LogTable::multiplyMerge(...$this->getMultiplyMergeParam(
$event,
$userId));
124 $this->isAlreadyPlanned =
false;
127 private function updateDateDeleteDeferred(EO_Log_Collection $logs, ?DateTime $dateDelete): void
131 if ($dateDelete ===
null)
133 $dateDelete =
new DateTime();
134 $dateDelete->add(self::FAST_EXPIRY_INTERVAL);
137 $newDateDeleteTs = $dateDelete->getTimestamp();
138 foreach ($logs as $log)
140 $oldDateDelete = $log->getDateDelete();
141 if ($oldDateDelete ===
null || $oldDateDelete->getTimestamp() > $newDateDeleteTs)
143 $log->setDateDelete($dateDelete);
150 private function getGroupedEvents():
array
155 foreach ($this->events as [
'event' =>
$event,
'user' =>
$userId])
157 $userId = $this->filterUsers($this->getUsersFromEvent([
'user' =>
$userId]));
164 $key =
"{$event->eventName}|{$event->entityType}|{$event->entityId}";
179 private function filterUsers(
array $users):
array
181 if (!isset($this->allowedUsers))
183 $this->fillAllowedUsers();
188 if (!isset($this->allowedUsers[
$userId]))
197 private function fillAllowedUsers(): void
199 $allUsers = $this->getUsers();
205 if ($isRealUser &&
$user->isActive())
212 private function getUsers():
array
216 foreach ($this->events as
$event)
218 $eventUsers = $this->getUsersFromEvent(
$event);
220 foreach ($eventUsers as $eventUser)
222 $users[$eventUser] = $eventUser;
229 private function getUsersFromEvent(
array $eventItem):
array
231 $users = $eventItem[
'user'] ?? [];
235 return [$users => $users];
238 if (is_array($users))
242 foreach ($users as $id)
253 private function filterWithoutMobile(
array $userIds):
array
260 return PushTable::query()
261 ->setSelect([
'USER_ID'])
262 ->whereIn(
'USER_ID', $userIds)
268 private function filterInactive(
array $userIds):
array
277 ->whereIn(
'ID', $userIds)
278 ->where(
'ACTIVE',
true)
279 ->where(
'REAL_USER',
'expr',
true)
285 private function runClosureInEvents(): void
296 private function mergeByKey(
array ...$arrays):
array
299 foreach ($arrays as $array)
301 foreach ($array as
$key => $value)
312 $intUserId = array_values(
$userId)[0];
316 'USER_ID' => $intUserId,
317 'ENTITY_TYPE' =>
$event->entityType,
318 'ENTITY_ID' =>
$event->entityId,
319 'EVENT' =>
$event->eventName,
320 'DATE_CREATE' =>
$event->getDateCreate(),
321 'DATE_DELETE' =>
$event->getDateDelete(),
324 'EVENT' =>
$event->eventName,
325 'DATE_CREATE' =>
$event->getDateCreate(),
326 'DATE_DELETE' =>
$event->getDateDelete(),
344 'ENTITY_TYPE' =>
$event->entityType,
345 'ENTITY_ID' =>
$event->entityId,
346 'EVENT' =>
$event->eventName,
347 'DATE_CREATE' =>
$event->getDateCreate(),
348 'DATE_DELETE' =>
$event->getDateDelete(),
355 'EVENT' =>
$event->eventName,
356 'DATE_CREATE' =>
$event->getDateCreate(),
357 'DATE_DELETE' =>
$event->getDateDelete(),
364 [
'DEADLOCK_SAFE' =>
true]
static includeModule($moduleName)
static getExternalUserTypes()