1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
DisappearService.php
См. документацию.
1<?php
2
3namespace Bitrix\Im\V2\Message\Delete;
4
5use Bitrix\Im\Model\MessageDisappearingTable;
6use Bitrix\Im\V2\Analytics\ChatAnalytics;
7use Bitrix\Im\V2\Application\Features;
8use Bitrix\Im\V2\Chat;
9use Bitrix\Im\V2\Chat\ChatError;
10use Bitrix\Im\V2\Integration\Socialnetwork\Collab\Collab;
11use Bitrix\Im\V2\Message;
12use Bitrix\Im\V2\Permission;
13use Bitrix\Im\V2\Pull\Event\MessagesAutoDeleteDelayChanged;
14use Bitrix\Im\V2\Pull\Event\UpdateFeature;
15use Bitrix\Im\V2\Result;
16use Bitrix\Main\Event;
17use Bitrix\Main\Localization\Loc;
18use Bitrix\Main\Type\DateTime;
19use Bitrix\Im\V2\Chat\MessagesAutoDelete\MessagesAutoDeleteConfigs;
20
22{
23 public const TIME_WHITELIST = [
24 0, //disable
25 1, //hour
26 24, //day
27 168, //week
28 720, //month
29 ];
30 private const DISAPPEARING_TIME_UNIT = 'hours';
31 private const TIME_UNIT_HOUR = 'HOUR';
32 private const TIME_UNIT_DAY = 'DAY';
33 private const TIME_UNIT_WEEK = 'WEEK';
34 private const TIME_UNIT_MONTH = 'MONTH';
35
43 public static function checkDisappearing($messageId, $messageFields): bool
44 {
46
47 if (
48 !$message->getChat()->getMessagesAutoDeleteDelay()
49 || $message->isSystem()
50 )
51 {
52 return false;
53 }
54
55 $result = MessageDisappearingTable::add([
56 'MESSAGE_ID' => $message->getId(),
57 'DATE_CREATE' => new DateTime(),
58 'DATE_REMOVE' => (new DateTime())->add($message->getChat()->getMessagesAutoDeleteDelay() . ' ' . self::DISAPPEARING_TIME_UNIT)
59 ]);
60
61 return $result->isSuccess();
62 }
63
64 public static function disappearMessage(Message $message, int $delay): Result
65 {
66 $result = new Result();
67
68 if ($delay === 0 || !self::isTimeValid($delay))
69 {
70 return $result
72 ;
73 }
74
75 if ($message->isDisappearing())
76 {
77 return $result
79 ;
80 }
81
82 $addResult = MessageDisappearingTable::add([
83 'MESSAGE_ID' => $message->getId(),
84 'DATE_CREATE' => new DateTime(),
85 'DATE_REMOVE' => (new DateTime())->add($delay . ' ' . self::DISAPPEARING_TIME_UNIT)
86 ]);
87
88 if (!$addResult->isSuccess())
89 {
90 $result->addErrors($addResult->getErrors());
91 }
92
93 return $result;
94 }
95
101 public static function disappearChat(Chat $chat, int $delay): Result
102 {
103 $result = self::formatResult($chat->getId() ?? 0);
104 $prevDelay = $chat->getMessagesAutoDeleteDelay();
105
106 if ($prevDelay === $delay)
107 {
108 return $result;
109 }
110
111 $availabilityResult = self::checkAvailabilityByOption();
112 if ($delay !== 0 && !$availabilityResult->isSuccess())
113 {
114 return self::disappearChat($chat, 0);
115 }
116
117 if (!self::isTimeValid($delay))
118 {
119 return $result
121 ;
122 }
123
124 if (self::isPrivateChatWithBot($chat))
125 {
126 return $result
127 ->addError(new ChatError(ChatError::ACCESS_DENIED))
128 ;
129 }
130
131 $chat->setMessagesAutoDeleteDelay($delay);
132 $saveResult = $chat->save();
133
134 if (!$saveResult->isSuccess())
135 {
136 return $result
137 ->addErrors($saveResult->getErrors())
138 ;
139 }
140
141 self::sendPull($chat);
142 self::sendMessage($chat, $prevDelay, $delay);
143 self::sendAnalytics($chat, $prevDelay, $delay);
144
145 return $result;
146 }
147
153 public static function disappearCollab(Chat\CollabChat $chat, int $delay): Result
154 {
155 $chatId = $chat->getId() ?? 0;
156 $result = Collab::updateCollabOption(
157 $chat,
158 'messagesAutoDeleteDelay',
159 (string)$delay
160 );
161
162 if (!$result->isSuccess())
163 {
164 return self::formatResult($chatId)
165 ->addErrors($result->getErrors())
166 ;
167 }
168
169 return self::formatResult($chatId);
170 }
171
176 public static function formatResult(int $chatId): Result
177 {
178 $config = new MessagesAutoDeleteConfigs([$chatId]);
179 return (new Result())->setResult($config);
180 }
181
182 protected static function isTimeValid(int $hours): bool
183 {
184 return in_array($hours, self::TIME_WHITELIST, true);
185 }
186
187 public static function checkAvailabilityByOption(): Result
188 {
189 $result = new Result();
190
191 if (!Features::isMessagesAutoDeleteEnabled())
192 {
194 }
195
196 return $result;
197 }
198
199 public static function getMessagesDisappearingTime(array $messageIds): array
200 {
201 $rows = MessageDisappearingTable::getList([
202 'filter' => [
203 'MESSAGE_ID' => $messageIds
204 ]
205 ]);
206 $result = [];
207 foreach ($rows as $row)
208 {
209 $result[$row['MESSAGE_ID']] = $row;
210 }
211
212 return $result;
213 }
214
215 private static function getDisappearingMessage(int $prevDelay, int $currenDelay, int $userId): string
216 {
217 $timeUnitTextBefore = self::getTimeUnitTextFromDelay($prevDelay);
218 $timeUnitTextAfter = self::getTimeUnitTextFromDelay($currenDelay);
219
220 $replaces = [
221 '#USER_ID#' => $userId,
222 '#NEW_TIME_UNIT#' => $timeUnitTextAfter,
223 '#OLD_TIME_UNIT#' => $timeUnitTextBefore,
224 ];
225
226 $messageCode = match (true)
227 {
228 $currenDelay === 0 => 'DISAPPEAR_MESSAGES_OFF',
229 $prevDelay > 0 => 'DISAPPEAR_MESSAGES_CHANGE',
230 $prevDelay === 0 => 'DISAPPEAR_MESSAGES_ON',
231 default => '',
232 };
233
234 return Loc::getMessage($messageCode, $replaces) ?? '';
235 }
236
237 protected static function getTimeUnitTextFromDelay(int $delay): string
238 {
239 $timeUnitText = match ($delay)
240 {
241 720 => Loc::getMessage('DISAPPEAR_TIME_UNIT_ONE_MONTH'),
242 168 => Loc::getMessage('DISAPPEAR_TIME_UNIT_ONE_WEEK'),
243 24 => Loc::getMessage('DISAPPEAR_TIME_UNIT_ONE_DAY'),
244 1 => Loc::getMessage('DISAPPEAR_TIME_UNIT_ONE_HOUR'),
245 default => '',
246 };
247
248 return $timeUnitText ?? '';
249 }
250
251 protected static function getBaseMessageFields(Chat $chat): array
252 {
253 return [
254 'FROM_USER_ID' => $chat->getContext()->getUserId(),
255 'MESSAGE_TYPE' => $chat->getType(),
256 'TO_CHAT_ID' => $chat->getChatId(),
257 'MESSAGE' => '',
258 'SYSTEM' => 'Y',
259 'PUSH' => 'N'
260 ];
261 }
262
263 private static function sendMessage(Chat $chat, int $prevDelay, int $currentDelay): void
264 {
265 if ($prevDelay < 0 || $currentDelay < 0)
266 {
267 return;
268 }
269
271 $message['MESSAGE'] = self::getDisappearingMessage($prevDelay, $currentDelay, $chat->getContext()->getUserId());
272
274 }
275
276 private static function sendAnalytics(Chat $chat, int $prevAutoDeleteDelay, int $currentAutoDeleteDelay): void
277 {
278 if ($prevAutoDeleteDelay === 0 && $currentAutoDeleteDelay > 0)
279 {
280 (new ChatAnalytics($chat))->addAutoDeleteOn($currentAutoDeleteDelay);
281 }
282 elseif ($prevAutoDeleteDelay > 0 && $currentAutoDeleteDelay === 0)
283 {
284 (new ChatAnalytics($chat))->addAutoDeleteOff();
285 }
286 }
287
288 public static function sendMessageAfterChatAdd(Chat $chat): void
289 {
290 $messagesAutoDeleteDelay = $chat->getMessagesAutoDeleteDelay();
291 if ($messagesAutoDeleteDelay > 0)
292 {
293 self::sendMessage($chat, 0, $messagesAutoDeleteDelay);
294 }
295 }
296
297 private static function sendPull(Chat $chat): Result
298 {
299 return (new MessagesAutoDeleteDelayChanged($chat))->send();
300 }
301
302 private static function isPrivateChatWithBot(Chat $chat): bool
303 {
304 return
305 $chat instanceof Chat\PrivateChat
306 && $chat->getCompanion()->isBot()
307 ;
308 }
309
310 public static function onAutoDeleteOptionChanged(Event $event): void
311 {
312 $value = $event->getParameter('value');
313
314 if (!isset($value) || !in_array($value, ['Y', 'N'], true))
315 {
316 return;
317 }
318
319 $value = $value === 'Y';
320 (new UpdateFeature('messagesAutoDeleteEnabled', $value))->send();
321 }
322
323 public static function checkAvailability(string $chatType): Result
324 {
325 $role = Permission::getRoleForActionByType(
326 $chatType,
327 Permission\Action::ChangeMessagesAutoDeleteDelay
328 );
330
331 if ($role === Chat::ROLE_NONE)
332 {
334 }
335
336 return $result;
337 }
338}
$messageFields
Определения callback_ednaru.php:22
if(! $messageFields||!isset($messageFields['message_id'])||!isset($messageFields['status'])||!CModule::IncludeModule("messageservice")) $messageId
Определения callback_ismscenter.php:26
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
Определения check_mail.php:18
static getType($chatData, bool $camelCase=true)
Определения chat.php:45
const WRONG_PARAMETER
Определения ChatError.php:12
const ACCESS_DENIED
Определения ChatError.php:19
static disappearChat(Chat $chat, int $delay)
Определения DisappearService.php:101
static disappearCollab(Chat\CollabChat $chat, int $delay)
Определения DisappearService.php:153
static disappearMessage(Message $message, int $delay)
Определения DisappearService.php:64
static getTimeUnitTextFromDelay(int $delay)
Определения DisappearService.php:237
static getMessagesDisappearingTime(array $messageIds)
Определения DisappearService.php:199
static sendMessageAfterChatAdd(Chat $chat)
Определения DisappearService.php:288
static onAutoDeleteOptionChanged(Event $event)
Определения DisappearService.php:310
static getBaseMessageFields(Chat $chat)
Определения DisappearService.php:251
static formatResult(int $chatId)
Определения DisappearService.php:176
static checkAvailability(string $chatType)
Определения DisappearService.php:323
static checkDisappearing($messageId, $messageFields)
Определения DisappearService.php:43
Определения result.php:20
static Add($arFields)
Определения im_message.php:28
$hours
Определения cron_html_pages.php:15
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$result
Определения get_property_values.php:14
Определения Uuid.php:3
$message
Определения payment.php:8
$event
Определения prolog_after.php:141
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
$config
Определения quickway.php:69
$rows
Определения options.php:264