- Модуль: imbot
- Путь к файлу: ~/bitrix/modules/imbot/lib/bot/support24.php
- Класс: BitrixImBotBotSupport24
- Вызов: Support24::onMessageAdd
static function onMessageAdd($messageId, $messageFields)
{
if (!MainLoader::includeModule('im'))
{
return false;
}
$fromUserId = (int)$messageFields['FROM_USER_ID'];
$dialogId = (string)$messageFields['FROM_USER_ID'];
$isChat = (
isset($messageFields['CHAT_ENTITY_TYPE'])
&& $messageFields['CHAT_ENTITY_TYPE'] === self::CHAT_ENTITY_TYPE
);
if ($isChat)
{
$dialogId = 'chat'.(int)$messageFields['CHAT_ID'];
}
// check restrictions
if (!self::checkMembershipRestriction($messageFields))
{
$groupLimited = self::getMessage('GROUP_LIMITED');
if ($groupLimited)
{
self::sendMessage([
'TO_USER_ID' => $fromUserId,
'DIALOG_ID' => $dialogId,
'MESSAGE' => $groupLimited,
'SYSTEM' => 'Y',
'URL_PREVIEW' => 'N'
]);
}
(new CIMChat(self::getBotId()))->deleteUser($messageFields['CHAT_ID'], self::getBotId());
return true;
}
// specialized support chats
if (
self::isEnabledQuestionFunctional()
&& !(self::instanceDialogSession(self::getBotId(), $dialogId)->getSessionId() > 0)
&& !self::allowAdditionalQuestion()
)
{
self::markMessageUndelivered($messageId);
$questionDisallowed = self::getQuestionDisallowMessage();
if ($questionDisallowed)
{
self::sendMessage([
'DIALOG_ID' => $dialogId,
'MESSAGE' => $questionDisallowed,
'KEYBOARD' => self::getQuestionResumeButton(),
'URL_PREVIEW' => 'N',
'SYSTEM' => 'Y',
]);
}
return true;
}
$allowShowMenu = self::hasBotMenu();
$warningRestrictionMessage = '';
if (
self::isActivePartnerSupport() &&
self::isUserIntegrator($fromUserId)
)
{
// check if integrator may write to support24 OL
if (!Partner24::allowIntegratorAccessAlongSupport24())
{
// show message about partner OL
$warningRestrictionMessage = self::getMessage('MESSAGE_PARTNER_INTEGRATOR');
$allowShowMenu = false;
}
}
elseif (
self::isActivePartnerSupport() &&
!self::isUserIntegrator($fromUserId)
)
{
$warningRestrictionMessage = self::getMessage('MESSAGE_PARTNER');
$allowShowMenu = false;
}
else if (self::getSupportLevel() == self::SUPPORT_LEVEL_FREE)
{
if (self::isActiveFreeSupport())
{
if (!self::isActiveFreeSupportForUser($fromUserId))
{
$warningRestrictionMessage = self::getMessage('MESSAGE_LIMITED');
}
}
else if (!self::isUserIntegrator($fromUserId))
{
$warningRestrictionMessage = self::getMessage('MESSAGE_END');
}
}
else if (self::getSupportLevel() == self::SUPPORT_LEVEL_PAID)
{
if (!self::isActivePaidSupportForUser($fromUserId))
{
$warningRestrictionMessage = self::getMessage('MESSAGE_LIMITED');
}
}
// ITR menu on before any dialog starts
if ($allowShowMenu)
{
if ((int)self::instanceDialogSession(self::getBotId(), $dialogId)->getParam('CLOSED') == 1)
{
self::instanceDialogSession(self::getBotId(), $dialogId)->update(['MENU_STATE' => null]);
}
if (!self::isMenuTrackFinished((string)$dialogId))
{
$lastMenuItemId = self::getBotMenu()->setDialogId($dialogId)->getLastTrackItemId();
if (!$lastMenuItemId && !empty($warningRestrictionMessage))
{
// show restriction warning message first
self::sendMessage([
'DIALOG_ID' => $dialogId,
'MESSAGE' => $warningRestrictionMessage,
'URL_PREVIEW' => 'N',
]);
}
if ($lastMenuItemId !== ItrMenu::MENU_EXIT_ID)
{
self::markMessageUndelivered($messageId);
$undeliveredMessage = self::getMessage('MESSAGE_UNDELIVERED');
if ($undeliveredMessage)
{
self::sendMessage([
'DIALOG_ID' => $dialogId,
'MESSAGE' => $undeliveredMessage,
'URL_PREVIEW' => 'N',
]);
}
self::showMenu([
'DIALOG_ID' => $dialogId,
'FULL_REDRAW' => true,
'UNDELIVERED_MESSAGE' => $messageId
]);
if (!self::isMenuTrackFinished((string)$dialogId))
{
return false;//continue menu travel
}
}
}
}
elseif (
// disallow start dialog
!empty($warningRestrictionMessage)
// allow start dialog if greeting has been shown @see
&& self::allowSendStartMessage(['BOT_ID' => self::getBotId(), 'DIALOG_ID' => $messageFields['DIALOG_ID']])
)
{
self::markMessageUndelivered($messageId);
// show restriction warning message
self::sendMessage([
'DIALOG_ID' => $dialogId,
'MESSAGE' => $warningRestrictionMessage,
'URL_PREVIEW' => 'N',
]);
return true;
}
elseif ($dialogId)
{
self::startDialogSession([
'BOT_ID' => self::getBotId(),
'DIALOG_ID' => $dialogId,
'GREETING_SHOWN' => 'Y',
]);
self::stopMenuTrack((string)$dialogId);
}
// add menu action
if ($relatedMessages = (new CIMHistory)->getRelatedMessages($messageId, 1, 0, false, false))
{
foreach ($relatedMessages['message'] as $message)
{
if (
$message['system'] != 'Y'
&& isset($message['params'][self::MESSAGE_PARAM_ALLOW_QUOTE])
&& $message['params'][self::MESSAGE_PARAM_ALLOW_QUOTE] === 'Y'
)
{
$messageParameters = IMModelMessageParamTable::getList([
'select' => ['PARAM_VALUE'],
'filter' => [
'=MESSAGE_ID' => $message['id'],
'=PARAM_NAME' => MixinMESSAGE_PARAM_MENU_ACTION,
]
]);
if (($relatedMessageParam = $messageParameters->fetch()) && !empty($relatedMessageParam['PARAM_VALUE']))
{
$messageFields['PARAMS'] = $messageFields['PARAMS'] ?? [];
$messageFields['PARAMS'][MixinMESSAGE_PARAM_MENU_ACTION] = $relatedMessageParam['PARAM_VALUE'];
}
break;
}
}
}
return parent::onMessageAdd($messageId, $messageFields);
}