3namespace Bitrix\Im\V2\Message\Delete;
5use Bitrix\Im\Model\MessageDisappearingTable;
6use Bitrix\Im\V2\Analytics\ChatAnalytics;
7use Bitrix\Im\V2\Application\Features;
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;
17use Bitrix\Main\Localization\Loc;
18use Bitrix\Main\Type\DateTime;
19use Bitrix\Im\V2\Chat\MessagesAutoDelete\MessagesAutoDeleteConfigs;
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';
48 !
$message->getChat()->getMessagesAutoDeleteDelay()
55 $result = MessageDisappearingTable::add([
58 'DATE_REMOVE' => (
new DateTime())->add(
$message->getChat()->getMessagesAutoDeleteDelay() .
' ' . self::DISAPPEARING_TIME_UNIT)
68 if ($delay === 0 || !self::isTimeValid($delay))
82 $addResult = MessageDisappearingTable::add([
85 'DATE_REMOVE' => (
new DateTime())->add($delay .
' ' . self::DISAPPEARING_TIME_UNIT)
88 if (!$addResult->isSuccess())
90 $result->addErrors($addResult->getErrors());
104 $prevDelay = $chat->getMessagesAutoDeleteDelay();
106 if ($prevDelay === $delay)
112 if ($delay !== 0 && !$availabilityResult->isSuccess())
117 if (!self::isTimeValid($delay))
124 if (self::isPrivateChatWithBot($chat))
131 $chat->setMessagesAutoDeleteDelay($delay);
132 $saveResult = $chat->save();
134 if (!$saveResult->isSuccess())
137 ->addErrors($saveResult->getErrors())
141 self::sendPull($chat);
142 self::sendMessage($chat, $prevDelay, $delay);
143 self::sendAnalytics($chat, $prevDelay, $delay);
155 $chatId = $chat->getId() ?? 0;
156 $result = Collab::updateCollabOption(
158 'messagesAutoDeleteDelay',
165 ->addErrors(
$result->getErrors())
184 return in_array(
$hours, self::TIME_WHITELIST,
true);
191 if (!Features::isMessagesAutoDeleteEnabled())
201 $rows = MessageDisappearingTable::getList([
203 'MESSAGE_ID' => $messageIds
207 foreach (
$rows as $row)
209 $result[$row[
'MESSAGE_ID']] = $row;
215 private static function getDisappearingMessage(
int $prevDelay,
int $currenDelay,
int $userId): string
222 '#NEW_TIME_UNIT#' => $timeUnitTextAfter,
223 '#OLD_TIME_UNIT#' => $timeUnitTextBefore,
226 $messageCode = match (
true)
228 $currenDelay === 0 =>
'DISAPPEAR_MESSAGES_OFF',
229 $prevDelay > 0 =>
'DISAPPEAR_MESSAGES_CHANGE',
230 $prevDelay === 0 =>
'DISAPPEAR_MESSAGES_ON',
234 return Loc::getMessage($messageCode, $replaces) ??
'';
239 $timeUnitText = match ($delay)
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'),
248 return $timeUnitText ??
'';
254 'FROM_USER_ID' => $chat->getContext()->getUserId(),
255 'MESSAGE_TYPE' => $chat->
getType(),
256 'TO_CHAT_ID' => $chat->getChatId(),
263 private static function sendMessage(
Chat $chat,
int $prevDelay,
int $currentDelay): void
265 if ($prevDelay < 0 || $currentDelay < 0)
271 $message[
'MESSAGE'] = self::getDisappearingMessage($prevDelay, $currentDelay, $chat->getContext()->getUserId());
276 private static function sendAnalytics(
Chat $chat,
int $prevAutoDeleteDelay,
int $currentAutoDeleteDelay): void
278 if ($prevAutoDeleteDelay === 0 && $currentAutoDeleteDelay > 0)
280 (
new ChatAnalytics($chat))->addAutoDeleteOn($currentAutoDeleteDelay);
282 elseif ($prevAutoDeleteDelay > 0 && $currentAutoDeleteDelay === 0)
290 $messagesAutoDeleteDelay = $chat->getMessagesAutoDeleteDelay();
291 if ($messagesAutoDeleteDelay > 0)
293 self::sendMessage($chat, 0, $messagesAutoDeleteDelay);
297 private static function sendPull(
Chat $chat):
Result
302 private static function isPrivateChatWithBot(
Chat $chat): bool
306 && $chat->getCompanion()->isBot()
312 $value =
$event->getParameter(
'value');
314 if (!isset($value) || !in_array($value, [
'Y',
'N'],
true))
319 $value = $value ===
'Y';
320 (
new UpdateFeature(
'messagesAutoDeleteEnabled', $value))->send();
325 $role = Permission::getRoleForActionByType(
327 Permission\Action::ChangeMessagesAutoDeleteDelay
331 if ($role === Chat::ROLE_NONE)
if(! $messageFields||!isset($messageFields['message_id'])||!isset($messageFields['status'])||!CModule::IncludeModule("messageservice")) $messageId
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
static getType($chatData, bool $camelCase=true)
static disappearChat(Chat $chat, int $delay)
static disappearCollab(Chat\CollabChat $chat, int $delay)
static disappearMessage(Message $message, int $delay)
static getTimeUnitTextFromDelay(int $delay)
static getMessagesDisappearingTime(array $messageIds)
static sendMessageAfterChatAdd(Chat $chat)
static onAutoDeleteOptionChanged(Event $event)
static checkAvailabilityByOption()
static getBaseMessageFields(Chat $chat)
static formatResult(int $chatId)
static checkAvailability(string $chatType)
static isTimeValid(int $hours)
static checkDisappearing($messageId, $messageFields)
const MESSAGES_AUTO_DELETE_DISABLED
const WRONG_MESSAGES_AUTO_DELETE_DELAY
const ALREADY_DISAPPEARING
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)