26 if ($sendingConfig ===
null)
30 $this->sendingConfig = $sendingConfig;
51 $this->processMessageAnchors(
$message);
53 $chat = $this->
getChat($message);
54 if ($this->canMention(
$message, $chat))
67 $this->updateMessageAnchors($previousMessage, $newMessage);
69 $chat = $this->
getChat($newMessage);
70 if ($this->canMention($newMessage, $chat))
72 $this->updateUsersMentions($previousMessage, $newMessage);
78 $chat = $this->
getChat($message);
80 $mentionedUserIds =
$message->getUserIdsToSendMentions();
81 unset($mentionedUserIds[
$message->getAuthorId()]);
83 $this->sendMentionsToUsers(
$message, $chat, $mentionedUserIds);
98 $chat = $this->
getChat($message);
99 $avatarUser =
$message->getAuthor()?->getAvatar();
100 $avatarChat = $chat->getAvatar(
false,
true);
101 $pushText = $this->preparePushMessage(
$message);
109 'TAG' =>
'IM_CHAT_' . $chat->getId(),
110 'CHAT_TYPE' => $chat->getType(),
111 'CATEGORY' =>
'ANSWER',
112 'URL' =>
SITE_DIR .
'mobile/ajax.php?mobile_action=im_answer',
114 'RECIPIENT_ID' =>
'chat' . $chat->getId(),
117 $result[
'push'][
'type'] = ($chat->getType() === Chat::IM_TYPE_OPEN ?
'openChat' :
'chat');
118 $result[
'push'][
'tag'] =
'IM_CHAT_' . $chat->getId();
119 $result[
'push'][
'sub_tag'] =
'IM_MESS';
120 $result[
'push'][
'app_id'] =
'Bitrix24';
121 $result[
'push'][
'message'] = $pushText;
122 $result[
'push'][
'advanced_params'] = [
123 'group' => ($chat->getEntityType() === Chat::ENTITY_TYPE_LINE ?
'im_lines_message' :
'im_message'),
124 'avatarUrl' => $avatarChat ?: $avatarUser,
125 'senderName' => $chatTitle,
126 'senderMessage' => $pushText,
134 Message::loadPhrases();
135 \CIMMessenger::loadLoc();
136 $chat = $this->
getChat($message);
140 $userGender = $author?->getGender() ??
'M';
142 $pushMessage =
$message->getMessage();
147 foreach (
$message->getFiles() as $file)
149 $pushFiles .=
" [".Loc::getMessage(
'IM_MESSAGE_FILE').
": ".$file->getDiskFile()->getName().
"]";
151 $pushMessage .= $pushFiles;
154 $hasAttach = mb_strpos($pushMessage,
'[ATTACH=') !==
false;
156 $pushMessage = preg_replace(
"/\[CODE\](.*?)\[\/CODE\]/si",
" [".Loc::getMessage(
'IM_MESSAGE_CODE').
"] ", $pushMessage);
157 $pushMessage = preg_replace(
"/\[s\].*?\[\/s\]/i",
"-", $pushMessage);
158 $pushMessage = preg_replace(
"/\[[bui]\](.*?)\[\/[bui]\]/i",
"$1", $pushMessage);
159 $pushMessage = preg_replace(
"/\\[url\\](.*?)\\[\\/url\\]/iu",
"$1", $pushMessage);
160 $pushMessage = preg_replace(
"/\\[url\\s*=\\s*((?:[^\\[\\]]++|\\[ (?: (?>[^\\[\\]]+) | (?:\\1) )* \\])+)\\s*\\](.*?)\\[\\/url\\]/ixsu",
"$2", $pushMessage);
161 $pushMessage = preg_replace_callback(
"/\[USER=([0-9]{1,})\]\[\/USER\]/i", [
'\Bitrix\Im\Text',
'modifyShortUserTag'], $pushMessage);
162 $pushMessage = preg_replace(
"/\[USER=([0-9]+)( REPLACE)?](.+?)\[\/USER]/i",
"$3", $pushMessage);
163 $pushMessage = preg_replace(
"/\[CHAT=([0-9]{1,})\](.*?)\[\/CHAT\]/i",
"$2", $pushMessage);
164 $pushMessage = preg_replace_callback(
"/\[SEND(?:=(?:.+?))?\](?:.+?)?\[\/SEND]/i", [
'\Bitrix\Im\Text',
'modifySendPut'], $pushMessage);
165 $pushMessage = preg_replace_callback(
"/\[PUT(?:=(?:.+?))?\](?:.+?)?\[\/PUT]/i", [
'\Bitrix\Im\Text',
'modifySendPut'], $pushMessage);
166 $pushMessage = preg_replace(
"/\[CALL(?:=(.+?))?\](.+?)?\[\/CALL\]/i",
"$2", $pushMessage);
167 $pushMessage = preg_replace(
"/\[PCH=([0-9]{1,})\](.*?)\[\/PCH\]/i",
"$2", $pushMessage);
168 $pushMessage = preg_replace_callback(
"/\[ICON\=([^\]]*)\]/i", [
'\Bitrix\Im\Text',
'modifyIcon'], $pushMessage);
169 $pushMessage = preg_replace_callback(
'/\[TIMESTAMP=(\d+) FORMAT=([^\]]*)\]/i', [Text::class,
'modifyTimestampCode'], $pushMessage);
170 $pushMessage = preg_replace(
'#\-{54}.+?\-{54}#s',
" [".Loc::getMessage(
'IM_MESSAGE_QUOTE').
"] ", str_replace(
'#BR#',
' ', $pushMessage));
171 $pushMessage = preg_replace(
'/^(>>(.*)(\n)?)/mi',
" [".Loc::getMessage(
'IM_MESSAGE_QUOTE').
"] ", str_replace(
'#BR#',
' ', $pushMessage));
173 if (!$pushFiles && !$hasAttach &&
$message->getParams()->isSet(
'ATTACH'))
175 $pushMessage .=
" [".Loc::getMessage(
'IM_MESSAGE_ATTACH').
"]";
179 Loc::getMessage(
'IM_MESSAGE_MENTION_PUSH_2_'.$userGender, [
'#USER#' =>
$userName,
'#TITLE#' => $chatTitle])
184 private function prepareNotifyMail(
string $chatTitle,
string $userGender): callable
186 return fn (?
string $languageId =
null) => Loc::getMessage(
188 [
'#TITLE#' => $chatTitle],
193 private function prepareNotifyMessage(
string $chatTitle, Message
$message,
string $userGender): callable
195 return fn (?
string $languageId =
null) => Loc::getMessage(
204 $chat = $this->
getChat($message);
206 return "[CHAT={$chat->getId()}]{$title}[/CHAT]";
211 return "IM_MESSAGE_MENTION_{$userGender}";
217 !$chat->allowMention()
218 || !$chat->getChatId()
232 $userGender =
$message->getAuthor()?->getGender() ===
'F' ?
'F' :
'M';
235 foreach ($mentionedUserIds as
$userId)
241 "FROM_USER_ID" =>
$message->getAuthorId(),
243 "NOTIFY_MODULE" =>
"im",
244 "NOTIFY_EVENT" =>
"mention",
245 "NOTIFY_TAG" =>
'IM|MENTION|' . $chat->getChatId(),
246 "NOTIFY_SUB_TAG" =>
'IM_MESS_' . $chat->getChatId() .
'_' .
$userId,
247 "NOTIFY_MESSAGE" => $this->prepareNotifyMessage($chatTitle,
$message, $userGender),
248 "NOTIFY_MESSAGE_OUT" => $this->prepareNotifyMail($chatTitle, $userGender),
262 $relation = $chat->getRelationByUserId(
$userId);
269 foreach ($unmentionedUserIds as
$userId)
271 CIMNotify::DeleteBySubTag(
'IM_MESS_' .
$message->getChatId() .
'_' .
$userId);
277 $anchorMentionedUserIds =
$message->getUserIdsToSendMentionAnchors();
278 unset($anchorMentionedUserIds[
$message->getAuthorId()]);
280 $this->addAnchors(
$message, $anchorMentionedUserIds);
283 private function updateMessageAnchors(
Message $previousMessage,
Message $newMessage): void
285 $previousMentionedUserIds = $previousMessage->getUserIdsToSendMentionAnchors();
286 $newMentionedUserIds = $newMessage->getUserIdsToSendMentionAnchors();
289 $previousMentionedUserIds[$previousMessage->getAuthorId()],
290 $newMentionedUserIds[$newMessage->getAuthorId()]
293 $toDelete = array_diff_key($previousMentionedUserIds, $newMentionedUserIds);
294 $this->deleteAnchors($newMessage, $toDelete);
296 $toAdd = array_diff_key($newMentionedUserIds, $previousMentionedUserIds);
297 $this->addAnchors($newMessage, $toAdd);
300 private function updateUsersMentions(Message $previousMessage, Message $newMessage): void
302 $chat = $this->
getChat($newMessage);
304 $previousMentionedUserIds = $previousMessage->getUserIdsToSendMentions();
305 $newMentionedUserIds = $newMessage->getUserIdsToSendMentions();
308 $previousMentionedUserIds[$previousMessage->getAuthorId()],
309 $newMentionedUserIds[$newMessage->getAuthorId()]
312 $toDelete = array_diff_key($previousMentionedUserIds, $newMentionedUserIds);
313 $this->deleteMentionNotifications($newMessage, $toDelete);
315 $toAdd = array_diff_key($newMentionedUserIds, $previousMentionedUserIds);
316 $this->sendMentionsToUsers($newMessage, $chat, $toAdd);
319 private function addAnchors(Message
$message,
array $mentionedUserIds): void
321 if (!AnchorFeature::isOn())
326 $anchorService = AnchorContainer::getInstance()
330 $anchorService->addMentionAnchor($mentionedUserIds);
333 private function deleteAnchors(Message
$message,
array $unmentionedUserIds): void
335 $anchorService = AnchorContainer::getInstance()
339 $anchorService->deleteUsersMentionAnchors($unmentionedUserIds);
const SITE_DIR(!defined('LANG'))